Задать вопрос
  • Какой браузер под Линукс выбрать?

    barmaley_exe
    @barmaley_exe
    По моим ощущениям Firefox потребляет память не так агрессивно, как Chromium-based браузеры. Ещё приятной фишкой является то, что если закрыть браузер, а потом открыть, то вкладки не будут загружаться до первого перехода на них. Актуально, если Вы любите оставлять вкладки "на потом".
    Ответ написан
    Комментировать
  • Кто может дистанционно помочь с изучением программирования?

    barmaley_exe
    @barmaley_exe
    Идите делать уже!

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

    0. Бесплатно. Чтобы заинтересовать по-настоящему крутого специалиста Ваше ценовое предложение должно быть очень и очень велико по очевидным причинам. Если же он хочет помогать Вам из альтруистических соображений, но непонятно, чем Вы лучше Пети из соседнего подъезда. Именно для такого рода помощи, сюрприз-сюрприз, и существуют StackOverflow-подобные ресурсы.
    1. Усреднением мнения нескольких людей можно побороть предвзятость и незнание одного конкретного человека.
    2. Если постоянно дёргать кого-то другого, этот кто-то научится, а Вы — нет. Нужно уметь находить ответы самостоятельно, не имея возможности кого-то спросить.
    3. Можно помогать другим участникам сообщества. Один из моих преподавателей когда-то в шутку сказал "Преподаю уже 10 лет — наконец-то сам начал понимать, что читаю". Как известно, в каждой шутке есть доля шутки, так что объяснение чего-либо кому-либо помогает Вам лучше разобраться в сути дела и структурировать собственные знания.

    Я уже распинался как-то раз на эту тему.

    Если Вам нужен начальный вектор, то вот:

    1. Язык — Python. Уже сейчас используется во всех мыслимых областях, обладает огромным сообществом и сравнительно несложен. Нынче, насколько я знаю, с него начинают обучение информатике в MIT. Потом, при желании, можно будет изучить ещё несколько. Изучение нового языка в пределах одной парадигмы не составляет труда.
    2. Если программирование для Вас область новая, то я бы посоветовал не окунаться сразу с головой в написание проекта, а начать с алгоритмических основ. Порешать задач на алгоритмы, научиться отлаживать код в голове. В результате будет проще думать о происходящем в дальнейшем.
    3. Написать таки какое-нибудь приложение. Проще всего сейчас целиться на веб, т.к. у нас есть браузеры с поддержкой хитрой разметки (HTML + CSS), позволяющей отобразить чуть ли не что угодно и не надо возиться с отрисовкой всего этого счастья. Тут нужно будет ознакомиться с HTML и CSS (чтобы приложение не выглядело как привет из 90-х, можно воспользоваться модными CSS фреймворками вроде Twitter Bootstrap), найти и овладеть каким-нибудь веб-фреймворком для выбранного языка (Например, Django для Python, но их очень много). На этой стадии должно быть много гугления, а в особо тяжких случаях — вопрошания на Тостере. Но не в обратном порядке!
    4. Программы обычно работают не в изолированной среде, а взаимодействуют с другими программами. Полезно знать, как это осуществляется. Для этого на более поздних этапах рекомендуется разобраться в, как минимум, сетях и операционных системах.
    Ответ написан
    8 комментариев
  • Тяжело ли устроиться на работу c++ разработчиком?

    barmaley_exe
    @barmaley_exe
    По своему опыту скажу, что в Москве и Питере если умеете программировать (т.е. знаете алгоритмы, сети, многопоточность, основы архитектуры, объектноориентированный дизайн и разбираетесь в каком-нибудь нормальном ОО языке), то без работы не останетесь. Даже студентов разбирают как горячие пирожки.
    Ответ написан
    Комментировать
  • Udacity платный?

    barmaley_exe
    @barmaley_exe
    Насколько я знаю, сами видео и упражнения там по-прежнему бесплатны (это называется "Access Course Materials"), а вот все остальные плюшки вроде сертификата и ментора стоят денег.
    Ответ написан
  • Как протестировать web сервер под нагрузкой?

    barmaley_exe
    @barmaley_exe
    Ответ написан
    Комментировать
  • Как вывести содержимое списка в виде одной строки?

    barmaley_exe
    @barmaley_exe
    print "".join(chart), если в chart уже строки. Иначе print "".join(map(str, chart))
    Ответ написан
    2 комментария
  • Какие источники информации по компьютерной графике посоветуете?

    barmaley_exe
    @barmaley_exe
    Сам я не особо разбираюсь в теме, но мне когда-то советовали Fundamentals of Computer Graphics [pdf]
    Ответ написан
    Комментировать
  • Что такое private в js?

    barmaley_exe
    @barmaley_exe
    Не писал на JS несколько лет, Angular, соответственно, тоже не трогал, но пока ES6 не вышел и на дворе ECMAScript 5:

    1. Потому что _подчёркивания, __двойныеПодчёркивания и __любыеДругиеПодчёркивания__ никак не контроллируют область видимости. Но есть механизмы, позволяющие ограничить доступ видимости.

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

    3. Термина private scope никогда не слышал, в ES5 есть function scope и global scope. Вложенная функция имеет доступ к scope "родительской" функции, у всех есть доступ к global scope (своего рода функция нулевого уровня).

    Советую почитать цикл статей Дмитрия Сошникова по Тонкостям JavaScript. Статьям уже 5 лет, но они покрывают основу ECMAScript, которая ещё справедлива и по сей день. Возможно, это изменится с выходом ES6.
    Ответ написан
  • Какие языки помогут лучше всего понять указатели и рекурсии?

    barmaley_exe
    @barmaley_exe
    Для рекурсии советую какой-нибудь чистый функциональный язык. Циклов там нет вообще, так что разберётесь, как мыслить "рекурсивно".
    Ответ написан
  • Есть ли достойные темы диплома для написания на Scala?

    barmaley_exe
    @barmaley_exe
    Законтрибьютьте что-нибудь в Spark.
    Ответ написан
    Комментировать
  • На каком уровне нужно уже уметь программировать, поступая на "программную инженерию" в ВУЗе?

    barmaley_exe
    @barmaley_exe
    Чем больше алгоритмов — тем лучше. Возьмите какую-нибудь книжку вроде Алгоритмы. Дасгупта, Пападимитриу, Вазирани, Структуры данных и алгоритмы. Ахо, Хопкрофт, Ульман ну или Алгоритмы: построение и анализ. Кормен, Лейзерстон....

    Но книжки читать не так полезно, как применять это на практике. Решайте задачи на acmp.ru, timus, spoj, посмотрите на соревнования на codeforces.ru.

    На ЯП я бы особого внимания не обращал — важней получить хорошую алгоритмическую базу, а разобраться во всём остальном потом можно будет за пару недель.
    Ответ написан
    Комментировать
  • Какой учебник лучше для изучения алгоримтов?

    barmaley_exe
    @barmaley_exe
    Можете ещё на этот посмотреть.
    Ответ написан
    Комментировать
  • Насколько значим сертификат edx ?

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

    Значимо лишь то, что у Вас в голове и что Вы умеете делать. С другой стороны, сертификат о прохождении онлайн-курса — маленький бонус, поскольку показывает Вашу заинтересованность в самообразовании, которое в IT необходимо как воздух.
    Ответ написан
    Комментировать
  • Как организовать динамический символьный массив в с++?

    barmaley_exe
    @barmaley_exe
    В общем случае нельзя предугадать, сколько элементов будет в массиве (можно оценить это значение сверху, но может быть крайне неэкономно), поэтому используется концепция расширяющихся массивов: имеется предвыделенный массив заданного размера, который заполняется по мере работы программы. Как только массив заполнен и места больше нет, а нужно вставить ешё один элемент, создается новый массив большей ёмкости, туда копируется содержимое старого, а элемент вставляется в новый массив. Старый после этого удаляется.

    Так реализован std::vector, например.
    Ответ написан
    Комментировать
  • Как реализовать рекомендательную систему по формуле Байеса?

    barmaley_exe
    @barmaley_exe
    Видимо, речь идёт о наивном Байесовском классификаторе.

    Во-первых, поставим проблему чуть иначе: вместо рекомендациях следует говорить о классификации на 2 класса (нравится или не нравится).

    Далее, наивный Байесовский классификатор основывается на 2 идеях: собственно, Теорема Байеса и условная независимость признаков объектов.

    Пусть P(like|x) — вероятность того, что данному пользователю понравится объект x, описывающийся характеристиками x1, ..., xn. Эти характеристики могут быть совершенно произвольными, не обязательно одного "типа". Вопрос лишь в том, какое вы зададите на них распределение. Очевидно, что если вероятность P(like|x) > 1/2, то вероятность негативной оценки будет меньше, а значит, нужно предсказывать "нравится". Таким образом, нашей задачей является оценить вероятности P(like|x) и P(dislike|x) (которая, в свою очередь равна 1-P(like|x), поскольку сумма вероятностей равна 1) и выбрать наибольшую.

    Тут самое время применить теорему Байеса:

    P(like|x) = P(x|like) P(like) / P(x) и P(dislike|x) = P(x|dislike) P(dislike) / P(x)

    Примечательным фактом является то, что знаменатель мы можем проигнорировать, ведь он один и тот же для P(like|x) и P(dislike|x), а нас интересует только соотношение между этими числами, а не они сами. Тогда сравнивать мы будем P(x|like) P(like) и P(x|dislike) P(dislike). В данном случае P(like) выражает наши априорные знания о том, насколько вероятно, что объект понравится пользователю. Если таких знаний нет, можно смело брать 1/2.
    P(x|like), в свою очередь, описывает, насколько вероятно встретить такой объект в классе понравившихся. Вся наивность рассматриваемого классификатора заключается именно в моделировании этого распределения.

    Поскольку вероятность P(x|like) может зависеть от x самым причудливым и произвольным образом, нам нужно сделать какое-то предположение. В случае наивного Байесовского классификатора этим предположением выступает ничем не подкреплённая гипотеза условной независимости признаков объекта при заданном классе, то есть: P(x|like) = P1(x1|like) ... Pn(xn|like). Здесь Pk — произвольное распределение, оно может быть как дискретным (цвет или тип, в Вашем случае), так и "непрерывным" (клиренс). Данные распределения должны быть выбраны разработчиком классификатора. Обычно они содержат какие-то параметры, которые мы в дальнейшем настроим по данным с помощью метода максимального правдоподобия. Для многих распределений оценки можно выписать аналитически. Например, для дискретных признаков можно посчитать эмпирическую частоту значения (плюс сглаживание для тех объектов, которые пользователь ни разу не видел), а для нормального распределения посчитать выборочное среднее и дисперсию.

    Резюмируя, ответы на Ваши вопросы:

    1. Формула Байеса имеет такое же отношение к Байесовскому классификатору, какое дерево к столу. Да, формула используется, но это ещё не всё.

    2. Про известные подходы ничего не скажу, но на ум приходит следующее: при классификации можно сравнивать не произведение вероятностей, а его логарифм (благодаря его монотонности) log(P1(x1|like) ... Pn(xn|like)) = log(P1(x1|like)) + ... + log(Pn(xn|like)). Чем больше эта сумма — тем больше вероятность лайка. Можно попробовать взвесить эти слагаемые.

    3. На отдельные признаки можно задавать произвольные распределения, например, нормальное для численных значений.

    Теперь о проблемах: вышеописанный подход хорош, но обладает существенным недостатком: если применять её ко всем пользователям без разбору, то получится модель среднего пользователя, которое будет рекомендовать всем одно и то же. Фишка же рекомендательной системы заключается в персонализации. С другой стороны, если строить по байесовскому классификатору на пользователя, скорее всего, Вам не хватит данных для получения каких-либо значимых результатов. Со второй проблемой можно бороться, если принять во внимание существование похожих пользователей: Если Алиса заинтересовалась объектами {A, B, C, D}, а Борису понравились {B, C, D, E}, то наивный Байес либо усреднит их со всеми остальными (представим, что существует 1000 пользователей, заинтересовавшихся объектом P. Тогда его "вес" будет существенно больше, но только лишь благодаря его популярности, а ведь для нахождения наиболее популярных объектов хватит и простой сортировки), либо построит для обоих по собственному классификатору, даже не подозревая о том, что эти пользователи похожи. Одним из подходов, учитывающих это, является коллаборативная фильтрация, наиболее активно используемая в задачах рекомендации.
    Ответ написан
    Комментировать
  • Как расшифровать hash md5(Wordpress)?

    barmaley_exe
    @barmaley_exe
    1. Хеши не расшифровываются.
    2. Но можно брутфорсом перебрать всякие строчки и посмотреть, не получается ли то же самое. На видеокартах нынче получается быстро, поэтому люди стараются замедлять алгоритмы хеширования, применяя их по нескольку раз.
    3. Ещё можно предварительно нахешировать кучу строчек (см. rainbow tables), а потом искать нужный хеш в этой базе
    4. Чтобы с этим бороться уже тысячу лет в криптографии существует понятие соли, делающей вышеупомянутые таблицы бесполезными. Более чем наерняка такой подход используется в сколь-нибудь современном wordpress'е.
    Ответ написан
  • Какие вы знаете самые лучшие книги по распознаванию образов?

    barmaley_exe
    @barmaley_exe
    Что вы понимаете под образами? Обычно распознавание и образы – отдельные вещи. Для первого используются подходы машинного обучения, а второе зависит от предметной области. Если мы говорим о картинках, то вторым занмается область, именуемая компьютерным зрением.

    По машинному обучению можно почитать следующее:
    The Elements of Statistical Learning (доступна бесплатно)
    Pattern Recognition and Machine Learning
    An Introduction to Statistical Learning (говорят, книжка попроще)

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

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

    В общем же, главной задачей всегда является переход из реального мира в область математических моделей (где уже можно применять алгоритмы машинного обучения). Здесь Вам потребуется собрать данные, очистить их, покрутить их всячески. Люди, занимающиеся Data Science любят говорить, что 20% – это сбор данных, 80% – это работа с данными, а оставшееся время – непосредственно ML.
    Ответ написан
  • Как сделать устойчивее полиноминальное хеширование?

    barmaley_exe
    @barmaley_exe
    Как пишут тут,
    Хеши должны быть с рандомизированным множителем/модулем, и модуль должен быть простым, иначе рано или поздно вас поймают!
    Ответ написан
    Комментировать
  • Есть ли смысл в изучении новых (совсем молодых) инструментов и языков программирования и какие у них перспективы?

    barmaley_exe
    @barmaley_exe
    Как справедливо заметили выше, Python и Ruby существуют уже 20+ лет, так что популярность они набрали уже давно.

    Go, Dart, Rust, D, etc интересны для изучения в целях расширения кругозора, но "в продакшен" не годятся: за 5 лет обширным сообществом не обзаведёшься, а, значит, ни выбора в плане библиотек, ни профессиональных кадров. Конечно, могут существовать отдельные проекты, исповедующие эти языки, но таких меньшинство.

    В последнее время многие прыгают вокруг JavaScript'а: сначала его перенесли на сервер (на самом деле, это сделали задолго до Node.JS, но не взлетело), а потом стали использовать чуть ли всюду (в win8, например, или PhoneGap). Но JS'у повезло иметь довольно больше коммьюнити на момент разгара этого хайпа, потому и понеслось.

    Выберите что-то из Python, Ruby, JS и разберитесь в этом (не столько в самом языке, сколько в его экосистеме, т.е. библиотеках, фреймворках и паттернах). Будет нужно — разберётесь в другом языке с его экосистемой. Идеи везде одни и те же, отличается только синтаксический сахар.
    Ответ написан
    Комментировать
  • Высшее очное образование в IT, возможность его получения, необходимость при поступлении на работу, для собственного дела?

    barmaley_exe
    @barmaley_exe
    По моему скромному мнению
    1. Неясно, что считается нормальным. Правда наполовину: алгоритмам, сетям, дискретке и прочим основам научат, но классного веб-девелопера не сделают.
    2. Смотря какую работу: фуллтайм в офисе действительно не совместить, а фриланс или 20 часов на старших курсах — вполне.
    3. Очень растяжимо.
    4. Правда. Этот пункт действительно непросто объяснить сташему поколению — видимо, они вне института ни разу не учились.

    Можно ли достаточно зарабатывать (от 100 тыс./руб.) не имея диплома?
    Законом не запрещено :-) Всё зависит от Вас: можно открыть своё дело, можно ворочить большие заказы с проверенными людьми на фрилансе, можно накопить много лет опыта, стать крутым чуваком и получать эти самые 100к, работая "на дядю". Разумеется, во всех этих случаях надо приложить немало усилий.

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

    Есть ли ВУЗы, которые дадут достойные знания по профессии разработчика?
    Если ориентируетесь на веб, то в РФ я таких не знаю. Если хотите достойных знаний на пересечении Computer Science, Software Engineering и прикладной математики, то СПбАУ, МФТИ, ВШЭ, ИТМО, СПбГУ, МГУ. Академический университет в этом году впервые принимает на бакалавриат, так что там возможны некоторые флуктуации, но, тем не менее, люди там серьёзные и настроены они соответствующе. В МФТИ есть базовая кафедра, а в ВШЭ теперь целый факультет Яндекса (у этих ребят вообще много всяких образовательных программ, обязательно посмотрите). Ну и ИТМО, СПбГУ и МГУ рекомендуются по-умолчанию :-)
    Ещё могу сказать про УрФУ: там есть классная IT-движуха (CTF, например), контакты с индустрией. А за счёт провинциальности (все вышеобозначенные вузы находятся в Москве и Питере) поступление на бюджет должно быть проще.

    Обязательно ли поступать в профильный ВУЗ или достаточно лишь факультета, а университет не важен?
    Для чего обязательно? Ничего не важно кроме полученных знаний. Даже диплом MIT'а при пустой голове ничем Вам не поможет.

    Резюмируя:
    — Если отсрочка не нужна (т.е. армия не грозит) и хочется заниматься вебом, то при современном уровне развития интернета 4 года можно потратить с большей пользой. Любые знания этого мира у вас под рукой в паре поисковых запросов — зачем ждать занятий, если начать получать знания можно уже сейчас? В то же время, к самообразованию в этом случае надо подойти ответственно: самомотивация не так проста как кажется, "учебный план" следует обсудить с более опытными коллегами, английский — must have. В идеале нужен ментор, который будет наставлять на путь истинный и отвечать на вопросы, но если такого нет, то его можно сделать путём "краудсорсинга" (Я верю, что StackExchange со всеми его разделами являет собой пример системы, способной ответить на практически любой вопрос, ответ на который человечеству известен)
    — Если хочется заниматься "наукоёмкими" задачами (Google Self-Driving car, детектирование лиц друзей на фотографиях в фейсбуке, построение отказоустойчивых систем), то без хорошего образования никуда и никак. Разумеется, поступить в хороший вуз и учиться там мало: нужно ещё и самообразованием активно заниматься.
    Ответ написан
    Комментировать