VD Net

30 апреля 2015, 12:13

Visual Studio Code

Visual Studio Code
На конференции Build 2015, что проходит с 29 апреля по 1 мая в Сан-Франциско, компания Microsoft традиционно представила ряд новинок, среди которых хотелось бы выделить легковесную среду разработки Visual Studio Code. Особенность этой среды заключается в том, что она абсолютно бесплатна и работает не только под Windows: имеются редакции для Linux и OS X.

Прежде всего среда разработки Visual Studio Code создана для работы над облачными и web приложениями, к примеру, поддерживаются технологии ASP.NET 5 и Node.js. А всего среда поддерживает более 30 языков программирования, среди которых имеются JavaScript, C#, C++, PHP, Java, HTML, R, CSS, SQL, Markdown, TypeScript, LESS, SASS, JSON, XML и Python. Как и в большом брате, в Visual Studio Code работает IntelliSense и подсветка синтаксиса, для части языков и технологий (Node.js, TypeScript и JavaScript) имеется встроенная возможность отладки. «Из коробки» поддерживается GIT.

Скачать Visual Studio Code можно будет с официального сайта, когда он заработает. Там же (плюс ещё здесь) можно найти дополнительную информацию о возможностях VSCode и их использовании. Ниже представлены альтернативные ссылки для скачивания VSCode (пока не работает официальный сайт):

23 октября 2012, 07:37

#ВыборыКС: собственный подсчёт

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

Пока данные с пирамидонами и без указания количества проголосовавших против всех (хотя вычисление этого параметра по протоколу мне не представляется возможным):


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

UPD. Точных совпадений по списку Мавроди 3933 (т.е. это те, кто проголосовал по списку Мавроди и никак иначе, даже не проставлял галочки либералам). Эти данные, в общем-то, не имеют смысла.

Проголосовали по списку Мавроди и поставили ещё какие-то галочки 12757 пирамидонов. Вот эти данные уже интереснее. Результаты без них:


При сравнении с официальными результатами, получаем, что в них было учтено больше мммщиков, чем в моих последних данных, а значит была ещё проверка на MMM == True и/или дату регистрации, попробуем сделать так же.

Дальше множество вариантов фильтрации

UPD. Поигрался немного со временем. Результаты, если отсеять всех мммщиков после 11:48 16 октября (их получилось 8888, мне это число понравилось) и учесть дубли:


Разница с официальными результатами по голосам не больше 10 пунктов (эмпирически, точно не проверял), но в обе стороны (поэтому и остановился на этом времени).

Эксперимент с Андреем Городенцевым

UPD. Т.к. последние результаты показали, что пирамидоны очень сильно мажут, не замечают бюллетени, да мало ли ещё что, поэтому ещё одни результаты, где совсем почти нет проголосовавших по указке Мавроди (это где-то 25% ошибок в списке Мавроди и минус 17091 пирамидон в результатах):


UPD. И эти же результаты, но только с вычетом тех, кто зарегистрировался после блокировки личных кабинетов МММ-2012 (а это минус 11895 мммщиков):


Эти результаты я бы и признал официальными. Нет, ещё одна поправка.

UPD. Относительно последних результатов поправлено время блокировки личных кабинетов (всё-таки это 16:48, а не полдень), результаты следующие (получаем минус 11235 мммщиков):


Вот, это точно те результаты, которые я бы признал официальными. Кстати, состав Координационного совета ничуть не изменился бы, если бы именно эти результаты сделали бы официальными :) Так что, несмотря на некоторые вещи, с которыми бы я не согласился (половинчатое выкидывание мммщиков, учёт дублей, неверное время блокировки ЛК МММ и пр.), получилось всё достаточно честно.
8 сентября 2011, 11:52

Лучший неудобочитаемый код

В этом топике собраны лучшие примеры неудобочитаемого кода с конкурса неудобо-кодеров 2011 :)
8 сентября 2011, 11:39

Исключения

Исключение — это ошибка, приводящая к невозможности выполнения алгоритма во время выполнения программы, не приводящее к завершению работы самой программы. Механизм обработки исключений очень сильно облегчает жизнь разработчику, не заставляя задумываться над некоторыми деталями работы алгоритма. Но есть и обратная сторона силы…
31 августа 2011, 12:26

[Записки программиста] Записка №2: «Исключения»

!!! Сообщение со старого блога !!!

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

Общий вид обработчика исключения таков:


try {
    <тело алгоритма>
} catch (<тип ошибки>) {
    <обработка ошибки данного типа>
} finally {
    <код, выполняющийся в независимости от возникновения ошибки после завершения алгоритма, либо аварийного выхода из него>
}

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

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

Как  уже сказал, механизм обработки исключений облегчает жизнь разработчику, а значит тут таится проигрыш в чём-то другом. Собственно, ради этого и написана статья. Так и есть, исключения достаточно сильно замедляют работу программы. Если рассмотреть программу как набор инструкций, то, добавляя в неё обработку исключений, мы, по сути, добавляем проверку на исключение к каждой инструкции, ведь неясно, какая инструкция может вызвать исключение. Современные компиляторы, конечно же, оптимизируют механизм обработки исключений, и условия накладываются не на все инструкции, а только на те, которые могут привести к исключению. Кроме того, многие программисты, не думая о том, где может быть исключение, а только зная, что оно может быть, оборачивают весь алгоритм в try-catch. Да, в этом случае программа не «падает», но она и не работает, что равноценно «падению». Ещё механизм исключений очень трудно включить в уже нарисованную блок-схему программы, что явно не лучшим образом сказывается на наглядности (как отображения кода на схему).

Кто-то скажет, что механизм исключений — единственное возможное средство борьбы с исключительными ситуациями. К сожалению, в большинстве фреймворков это так, ведь они построены на механизме исключений, но есть и другой выход. И другим выходом являются собственные условия на проблемные участки. Ждали число при парсинге строки, а там что-то иное? Почему бы не проверить перед этим строку посимвольно или регулярным выражением? Пытаетесь получить -3 элемент массива? Почему бы не проверить индекс перед этим? И уже нет вороха обратных вызовов (в случае если функции вложены), т.к. нет исключения, также нет навешанных обработчиков там, где это не нужно. Но что же делать, если функция должна вернуть результат, а мы не знаем о том, что там что-то не так. И тут мы имеем очень серьёзную недоработку механизма функций: возвращение только одного результата. Это ограничение архитектурное, поэтому решить его можно только на более высоком уровне. Не будем говорить о написании собственного компилятора или использовать ссылки для возврата значений, воспользуемся средствами ООП. Будем возвращать результат не в виде прямого результата, а в виде некой структуры, содержащей результат, а также код состояния.

Пример:


class Result<T>{
    T value;
    int code;
}

В этом псевдокоде T соответствует подстановке шаблона, т.к. в этом случае удобно использовать шаблонный класс. Пусть теперь функция будет возвращать объект данного класса, а мы всегда знать, что произошло в функции. Если код, к примеру 0, то функция (говорим о методах, ведь это ООП) верно завершила работу, а если какой-то иной, то заглянем в справочник кодов, либо сравним с какой-то из заданных констант, либо просто испугаемся, что не ноль и ничего делать не будем, а потом сделаем обработчик для этого кода. Получилось очень похоже на механизм обработки исключений, но без многих навесок этого самого механизма. Добавив в класс Result строковое поле с сообщением, мы ещё и текстовое описание ошибки сможем отдавать и получать. Наш алгоритм ничем не перегружен, всё поддаётся простейшим условиям, всё понятно и очевидно; блок-схема отражает всё, что есть в коде, а код содержит только то, что есть в блок-схеме. Минусом является только не совсем прямое использование результатов функций, а также формирование этих результатов в самой функции. Что интересно, многие функции WinAPI придерживаются именно такого стандарта (созданного ещё до времён внедрения ООП), возвращая состояние, а не результат. Возврат состояния позволяет очень точно контролировать поведение программы, не надеясь на обработку исключений кем-то и где-то.
27 декабря 2010, 07:51

[Записки программиста] Записка №1: «mdb-файл как база данных»

!!! Сообщение со старого блога !!!

Зачастую приходится делать небольшие программы, которые должны содержать в себе базу данных. Заморачиваться с тяжеловесными СУБД не очень хочется, ведь для того, чтобы всё работало, нужно наличие этой базы на компьютере пользователя. Поэтому логичным шагом будет использование mdb-файл в качестве баз данных, тем более, что их легко править через MS Access.

В примере будет использован язык C# и библиотека .NET Framework.

Начинается всё с указания источника:

String connectionString = "provider=Microsoft.Jet.OLEDB.4.0; data source=c:\base.mdb";
Конечно же, не забудьте подключить нужные библиотеки (System.Data.OleDb), ведь именно в них содержатся нужные классы, кроме того лучше всего будет сделать:

using System.Data.OleDb;
Далее создаём объект-коннектор к базе и открываем её:

OleDbConnection myOleDbConnection = new OleDbConnection(connectionString);
myOleDbConnection.Open();
Пришло время выполнения запросов. Сейчас мы сформируем запрос, получим ссылку на объект-читатель после выполнения запроса и разберёмся, как же прочитать ответ с помощью объекта-читателя:

OleDbCommand myOleDbCommand = myOleDbConnection.CreateCommand();
myOleDbCommand.CommandText = "SELECT ID FROM TABLE_A";
OleDbDataReader myOleDbDataReader = myOleDbCommand.ExecuteReader();
while (myOleDbDataReader.Read())
{
  MessageBox.Show(myOleDbDataReader["ID"]);
}
myOleDbDataReader.Close(); 
Как мы видим, запрос представляет собой обыкновенный SQL-запрос (чуть ниже я расскажу об одной обнаруженной особенности), а в качестве индекса в читателе можно указывать непосредственно название атрибута (при этом никто не запрещает использовать AS). Если неизвестны названия атрибутов, их количество, то используем доступ по индексу и получение количества с помощью свойства FieldCount у читателя.

После выполнения всех запросов нужно закрыть соединение с базой:

myOleDbConnection.Close();
Вот так вот просто и без проблем можно подключить к своей программе базу данных. Ещё данный метод можно применять, если мы хотим работать именно с mdb-файлами (т.е. читать и изменять их) в целях последующей обработки, к примеру, в самом MS Access. Например, для сбора каких-то данных. В принципе, фантазия не ограничена и этому способу можно дать бесконечное количество применений.

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

Всем спасибо, следите за следующими записками.
6 октября 2010, 13:00

Поисковик музыки по ВКонтакте.ру

!!! Сообщение со старого блога !!!

Да, наконец-то окончательно закрыл http://medvepoisk.ru/muzpoisk/, где использовался тот самый передовой скрипт поиска музыки по этой обители зла. Да, закрыл, теперь будет спокойно на душе.
Почему закрыл? А надоело, надоело заниматься этим проектом, пора покорять новые вершины, а не топтаться на одном месте.
Но тут хорошие новости заканчиваются и начинаются очень хорошие. Проект закрыт, а вот код остался. И он может пригодится кому-то. Зачем? Не знаю, но всё бывает, может кому и поможет, поэтому выкладываю его как есть, без прикрас (почти :)). Можете пользоваться как душе угодно.
Вот она, самая что ни на есть передовая версия скрипта: стырить.
Сразу скажу всем великим вебмастерам и мастерам кунгфуйского СЕО: скрипт сразу вот так вот с ходу работать не будет, т.к. нужно много чего поправить, да создать базу. Для скромных девелоперов же скрипт может пригодится. Да, никакой поддержки (платной, бесплатной, за спасибо, за рейтинг, за вконтакте-бабосы) не будет.
21 января 2010, 14:12

Скрипт поиска музыки по вконтакте.ру

!!! Сообщение со старого блога !!!

Решил выложить последнюю версию чистого скрипта. Из новшеств — мультилогин и поддержка нового метода авторизации на сайте.

Установка производится простым копированием файлов из архива на сервер, а как настраивать, указано в самом скрипте.

Вопросы по работе, улучшению, доработке или Ваши предложения и мысли публикуем в качестве комментариев.

Ссылка на скачивание — Скрипт поиска музыки на вконтакте.ру

P.S. Я не отвечаю за все последствия в процессе установки или работы скрипта! Используйте его на свой страх и риск!
1
Копирование и использование материалов сайта разрешается только при указании активной прямой ссылки без rel=nofollow на страницу с копируемым материалом. Если какие-то условия не выполнены или не могут быть выполнены, то разрешение можно получить по электронной почте vladislav.kochemaev@gmail.com с указанием цели использования. При копировании материалов сайта вы автоматически соглашаетесь с этими условиями.