понедельник, 24 ноября 2014 г.

Удивительные факты о наследовании

Говорят, с тех пор, как в Rust и Go убрали наследование, всех сторонников объектно-ориентированной парадигмы ждёт ад и погибель. Даже вроде бы адекватные блоггеры пишут об этом и советуют забыть про ООП. Код, который приводится в качестве примера, настолько прекрасен, что я не могу его не привести:

trait Animal {
  def word: String
  def talk() { println(this.word) }
}
class Cat extends Animal { def word = "Meow!" }

class Dog extends Animal { def word = "Woof!" }

class JustACat { def meow = "Meow!" }

class HappyCat extends JustACat with Animal {
  def word = meow + " :)"
}

class SadCat extends JustACat with Animal {
  def word = meow + " :("
}
val dog = new Dog()
dog.talk

"Вот по большому счету и все, что нужно знать об АТД и классах типов" сообщает нам автор. "Забудьте об ООП! Используйте АТД и тайпклассы!".

Не имею ничего против trait-ов и языка Scala, но такой пример реализации ООП порадует разве что борцов за права домашних животных. Абсолютно непонятно, какое отношение к реальным программам имеют все эти котики и собачки и как собрать из этих грузок и перегрузок что-то работающее. Вспоминать Майерса или Буча тут не стоит - куда уместней общеизвестная песенка:

Я жму на велике любимом,
Он зовется "Украина"
Но седло от унитаза,
А педаль от пианино.
Все потырили друзья,
В двух местах сломали раму,
Ну и пусть себе смеются,
Металлисты-наркоманы!

Раз уж пошла такая путаница, надо разобраться, какое бывает ООП. Обычно под ним понимают что-то в духе C++/C#/Java - модификаторы public/private/protected, виртуальные функции, наследование, и проч., проч., проч.

Но есть языки наподобие Python, Ruby или PHP - где приватных полей нет вообще, а приватность функций зависит от доброй воли пользователя библиотеки, а типы можно сравнивать через duck typing. При этом наследование в них очень разное: в PHP оно аналогично Java (можно наследовать только от одного класса), Python разрешает множественное наследование, а в Ruby разрешает новомодные подмешивания (впрочем, большинство пользователей про них не в курсе).

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

Ну и на закуску - есть известные реализации псевдо-ООП на C (вроде тех, что встроены в GTK и WinAPI), есть языки-надстройки вроде Lua, и громадную, ещё с начала 1990-х историю ORM для записи унаследованных объектов в реляционные базы данных.

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

О чём и было сказано уже в другом блоге, где дискуссия продолжалась: Ситуация усугубляется еще и тем, что из широкоизвестных ОО языков чисто ОО языками являются всего два -- Java и Eiffel.

вторник, 11 ноября 2014 г.

JavaScript: Receiving GET params of url - 2

Спустя два года увидел старый код, ужаснулся и всё переписал. Получилось короче и на порядок надёжней.
$.extend({
 UrlVars : null,
 getUrlVars : function(){
  if(this.UrlVars) return this.UrlVars;
  this.UrlVars = {};
  var index_separator = window.location.href.indexOf('?') + 1;
  if (index_separator) {
  var hashes = window.location.href.slice(index_separator).split('&');
  var i = hashes.length;
  while(i--){
   var hash = decodeURIComponent(hashes[i]).split('=');
   this.UrlVars[hash[0]] = hash[1];
  }
 }
 return this.UrlVars;
 },
 getUrlVar : function(key) {
 if(!key) return null;
 var vars = this.getUrlVars();
 return (typeof(vars[key]) != "undefined") ? vars[key] : "";
 }
});

среда, 1 октября 2014 г.

English Blog

Много исследую в области, про которые пишут в основном по-английски. Писать по-английски буду теперь в другой блог, а в этот - только по-русски.

'unknown variable “character-set-server=utf-8”' в mysqldump

Баг замечен в mysql 5.5.38 под SMP Debian Linux 3.2.60.

При попытке что-то сделать с mysqldump (даже если это mysqldump --version) получается стереотипная ошибка:

unknown variable "character-set-server=utf-8"

Что намекает, что разработчик mysqldump даже не подумал, что не для всех команд надо грузить настройки.

На StackOverflow советуют найти my.cnf (в моём случае, лежит в /etc/mysql/my.cnf) и, как подсказали в крмментах, заменить character-set-server=utf-8 на character-set-server=utf8 в разделе [mysqldump]. Между прочим, редактировать my.cnf можно только с правами админа.

четверг, 24 июля 2014 г.

Hadoop! Hadoop!

В последнее время про Hadoop пишут даже в ЖЖ. С тех пор, как Джоэль Спольски напророчил, что что Гугл всех победит, потому что его сотрудники читали SICP и используют Map Reduce, мир захватила Hadoop-омания. Каждый, у кого больше 1.44 Мб , хочет знать, как поставить Hadoop и стать большим, креативным и модным, как mr. Google. У кого меньше, тот вынужден ограничиться Эрлангом и компиляцей в облаке.

Ведь почему Гугл ищет быстро и точно? Потому что Map Reduce! А где Map Reduce? В Hadoop! Поэтому кто поставит себе Hadoop, тот сможет найти даже то, что Гугл на всякий случай удалил из результатов поиска.

Так вот, неправда всё это.

Зачем Map Reduce Гуглу, догадаться несложно. У Гугла петабайты данных на жёстких дисках, которые лежат в известной пустыне на известных складах. Диски ломаются, их меняют, достраивают новые склады. И всё это надо делать быстро. Вот и выстроилась система, при которой данные можно разбрасывать, как картошку, только успевай ведро подставлять.

А в целом Map Reduce - адски медленный. Потому что постоянно копирует и вставляет. И даже когда речь идёт о гигабайтах, он всё равно будет медленней (см. соответствующий курс на курсере). Он будет расширяемей, легче в обслуживании - да!

И медленней.

Поэтому Hadoop для 99.9% проектов не нужен. Если у вас много данных, кладите их в базу. А иначе будет драма наподобие:

Ну, там есть еще странности типа того, что чуваки используют его для конфигурирования 100 серверов и жалуются, что он не выдерживает нагрузки, если 100 серверов одновременно загружаются. Ну, в таком духе. Короче, не очень понятно, в чем с ним проблема, но что-то есть. В нем, на самом деле, есть еще концептуальная проблема, сам ZooKeeper внутри надежный, но, если ты используешь его для strong consistency, тебе нужно чтобы клиент был правильно написан. У них клиент очень примитивный, он не рассчитан даже на просто отключение от сервера, грубо говоря. Обработку ошибок нужно самому делать. Если хочется strong consistency, там, вообще говоря, очень нетривиально написать хорошего клиента.

В борьбе за достоверность

Итак, фальсификации.

Поддельные фото, видео, документы, высказывания, события, люди.

В последнее время (камеры дешёвые, видеоредакторы быстрые и общедоступные) их больше с каждым днём.

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

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

Первый вариант я нашёл на постнауке. Там выложена интересная глава из книги на тему (вставлю, если найду). Сводится к тому, что единственной защитой является 100% идентификация времени-места съёмки и человека, который её вёл. То есть если Вася из Ростова-на-Дону снял на мобильник летающую тарелку, то в свойствах видео это должно быть написано, а сам Вася, если попросят, должен предъявить паспорт, мобильник, самого себя и место, где он снимал (а также, желательно, летающую тарелку).

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

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

Если новости на тебя не влияют никак, то это работает. Но в этом и есть недостаток. Отказаться от ненужных новостей могут те, кому они не нужны.

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

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

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

Вот у нас есть фото, видео или аудиозапись. Мы пригласили в студию... да хотя бы даже бывшего разведчика (на CNN бывает). И спрашиваем, что он о ней думает. А он отвечает честно: дескать, я не знаю, тут смотреть в лаборатории надо, нет ли монтажа. Да и вообще в наше время такого не было.

Конечно, это ни разу не экспертиза. Мало ли чего не было двадцать лет назад? Во времена Рейгана и Linux-а не было - а при Буше-старшем появился. И не в США, а где-то в Финляндии. Может, и это "такое" появилось только в последнее время и не успело дойти до США.

Видимо, когда окончательно прижмёт, будут придуманы какие-то социал-инженерные решения для работы с подделками.

Или человечество просто забьёт.

среда, 23 июля 2014 г.

А. И. Орлов - Прикладная статистика (конспект)

Самое время освежить свои знания по другому учебнику. Читаю А. И. Орлов - Прикладная Статистика (М. Алгоритм 2004)

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

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


Введение

3 раздела статистики (по Гнезденко): 1) сбор статсведений 2) их исследование 3) разработка приёмов для 1) и 2)
3 – и есть матстатистика.

Теор. Вер. – XVII в. Метод наименьших квадратов Гадеса – 1794.

Современный этап – 1990, журнал Biometrica. Первая треть XX в.  - применяют в основном параметрическую статистику.

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

На 1990-ый акутальны для специалиста – ~100 000 публикаций. Даже в наиболее полном 3-хтомнике Кендалла-Стюарта учтены 2 тыс. Учёные уходят в тупиковые ветки и беспомощны с реальными данными. Фактически, включается адаптационный механизм торможения науки.
Результаты, не попавшие в учебник, как правило, забываются. Человек, получив образование, либо забивает и пользуется обломками данных, либо, если идёт в науку, копает только свой узкий канал (если копает). В итоге – ВУЗовские учебники до сих пор на уровне 40-60-х XX в. Публикации – аналогично.
В своё время сам Орлов работал с оценками параметрических семейств. Но ф-ция так правдоподобия, эффективности оценок, неравенство Рао-Крамера. Но этот подход – тупиковый, реальные данные не подчиняются каким-либо параметрическим семействам.

Прикладная делится на: математика, методы сбора данных, кодинг.

Матстатистика давно замкнулась внутри себя и не реагирует на соседние области. В этом она аналогична геометрии – ныне это ритуальный предмет и землю давно меряют геодезисты. Пересечение высот треугольника мало кому интересно. Поэтому учебные часы сокращаются, при поступлении больше не спрашивают. А это путь в историю науки, вслед за теологией.
Большинство методов в Statgraphics/SPSS/Statistica в учебниках просто нет.

четверг, 10 июля 2014 г.

Блоги - это не дневники

Первые известные блоги были коллективными и выросли из аналитических колонок (Slashdot, например). До них были частные рассылки, выросшие из официальных (некогда широко известный, а ныне напрочь перекупленный и забытый Subscribe.ru начинался как портал для кошек Citycat с рассылками).

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

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

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

Неспроста кронпринцев заставляли вести дневники - от великого князя Николая Павловича это потребовали, как только Александр I понял, что долго не протянет, Константин лишился прав на престол, и что престол придётся передавать младшему брату.

Сложно что-то узнать о человеке, особенно известном, из его в принципе публичного блога (толпы бытовых историй в топе происходят с друзьями и дочками друзей всё одних и тех же рож - везёт им, наверное). А вот последнего автора, которого читал Николай II, мы из его дневника знаем: это Салтыков-Щедрин. 

среда, 9 июля 2014 г.

Рекурсия о рекурсии

ivanon-petrov@lj всегда делает интереснейший подборки. Но в последнее время общее прокисание ЖЖ пробирается даже в них.

Даже в этих подборках всё больше остроумнейших мыслей вращаются не вокруг успехов биологии или того факта, что "концепции коммунальной собственности, унаследованной Калифорнией не из английского common law, а из юридических обычаев визиготской Испании, 5 в. н.э.". А вокруг основополагающих тем, как то:


  • учёные о науке (с жалобами на жизнь)
  • учёные о науке в РФ
  • учёные о науке в русскоязычном секторе ЖЖ
  • учёные об учёных
  • учёные о РФ
То есть та же самая скукота, что и:
  • ТВ, где журналисты приглашают в студию журналистов,
  • книг состарившихся писателей, где главный герой всегда писатель ("Мастер и Маргарита" простительна, там есть много кто ещё)
  • политиков, которых пристроили другие политики
  • мюзиклов из жизни варьете (из четырёх мюзиклов, рекламу которых я видел в метро, два - про варьете)
  • фильмов про то, как снимали фильм (хотя INLAND EMPIRE и хорош, но это же Линч)
Вот и ходишь теперь за наукой - на ПостНауку.

пятница, 4 июля 2014 г.

Мастер Леонардо

Софи Шово срывает покровы с биографии Леонардо да Винчи. Оказывается, рисовал он мало, скульптор был посредственный, да к тому же развратник и извращенец. А основными ео достижениями были дворцовые праздненства и музыкальные импровизации.

Обвинения сами по себе посредственны, но подумать тут есть над чем.

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

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

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

Так что спасибо Леонардо. Даже если он мало (по меркам XX века) до чего докопался - он честно копал и не скрывал своих находок.

понедельник, 30 июня 2014 г.

CsvHelper

Формат CSV не так прост, как кажется. Формально это просто табличка: столбцы разделены запятыми.

А вот при попытке с ним поработать начинается веселье:

  • Точку в десятичных числах, чтобы разделить разряды, ставят только англосаксы и программисты. Некоторые другие народы могут разделять их запятыми. Американское 10,000,000.03 - это русское 10.000.000,03. И если в системе установлена другая система представления чисел, то Excel сохранит файл, разделив столбцы точками с запятой. Хотя диалог сохранения в Excel будет по прежнему уверять, что сохраняет с запятыми как разделителями
  • CSV - не UNICODE, и по умолчанию сохраняется в текущей кодировке системы.
  • В первой строке - как правило, не данные, а названия столбцов.
Поэтому на C# такие файлы положено читать специальной библиотекой. Текущая версия есть в NUnit, а где-то в версии 3.0 вернутся и атрибуты для маппинга, которые я прикрутил обратно в своём форке.

Судьба Yume Hikki

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

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

Вернулся

Два года назад уходил в эксперименты на стенд-элоне.

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

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

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

Просто поразительно, как быстро человек забывает и как быстро зарастают тропы в непродуманных системах. Значит, придётся перепоручить хранение роботам.

среда, 4 июня 2014 г.

Роботы vs Человеки - 1 : 0

В магазине: "Вы извините, уже 9, компьютер пиво не пробьёт".

И человек склоняется перед волей робота.

суббота, 15 февраля 2014 г.

Историческая хитрость

Очередная хитрость - и царь был хороший, и большевики.

Плохими были только проанглийские либералы из Временного Правительства. Они и свергли хорошего царя.

А уже потом плохих либералов свергли хорошие большевики.