Algorithm Visualizer — визуализатор алгоритмов

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

GraphSearchК примеру, при поиске в графе обрабатываемые вершины будут подсвечиваться по мере поиска. Для сортировки переставляемые элементы выстроены в диаграмме, что очень облегчает понимание непростых алгоритмов.

Sort

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

 

Профилирование производительности приложения без установки Visual Studio

Думаю, многие программисты пользовались средствами анализа производительности, удобно интегрированных прямо в Visual Studio. Процесс настолько интуитивно понятен из графического интерфейса, что совсем не приходится задумываться, что в действительности, за сбор статистики работы приложения отвечает консольное приложение VsPerfCmd. Задумываться о том, что «под капотом» может понадобиться, если, к примеру, нужно собрать данные на компьютере без установленной Visual Studio. Сразу в голову приходит аналогия с удаленной отладкой, но в данном случае всё даже проще — специальный сервис просто собирает статистику в файл результатов, который потом можно открыть Visual Studio или добавить к существующим отчетам анализа производительности. Единственное требование — к исследуемым dll и exe файлам должны быть скопированы pdb-файлы, в противном случае проанализировать узкие места не удастся. Итак, первым делом, нужно установить сервис сбора статистики, инсталлятор находится в %VSInstallDir% Team ToolsPerformance ToolsSetups. Для VS 2012 — «C:Program Files (x86)Microsoft Visual Studio 11.0Team ToolsPerformance ToolsSetupsvs_profiler_x64_enu.exe»

Далее — запускаем сервис с нужным типом анализа и параметрами анализируемого приложения(путь и параметры командной строки). Ниже приведен скрипт на Powershell, который позволяет автоматизировать процесс присоединения к процессу и остановки сбора статистики при выходе из приложения. При подобной автоматизации процесс сбора и анализа производительности на удаленной машине не отличается от аналогичного процесса работы прямо из Visual Studio.

$tool = "C:Program Files (x86)Microsoft Visual Studio 11.0Team ToolsPerformance ToolsVSPerfCmd.exe"
$toolProcess = Start-Process $tool -ArgumentList "/Start:Sample /Output:c:perfstats2.vsp /Launch:""$analyzedProgramPath"" /Args:args "
$processName = [io.path]::GetFileNameWithoutExtension($analyzedProgramPath)
for ($i=0; $i -lt 1000; $i = $i+1) {
    $p = get-process ProcessName -ErrorAction SilentlyContinue<
    if (!$p) { break; }

    sleep -s 1 } Write-Host "Stopping collect..." $tool /Shutdown /Analyze:Procid

 

Если нужно подключиться к ранее запущенному процессу, например, к сервису можно пользоваться опций Attach.

 

Автоматическое обновление рабочей копии SVN при коммите в SVN

Использование svn для разворачивания копии рабочего кода на сервере является довольно удобным средством обновления версии приложения. Однако часто бывает так, что при разработке выполнять развертывание тестовой версии командой update на сервере слишком утомительно и хочется автоматически производить обновление кода при коммите.

Для того, чтобы на сервере, на котором работает сервер репозиториев svn при коммите выполнялись какие-либо действия, в частности, обновление рабочей копии — достаточно воспользоваться файлом /svn/repositoryname/hooks/post-commit В этом файле указываются действия, которые будут выполнены после каждого коммита в репозиторий.

Вписываем следующие строчки:
#!/bin/bash
cd /WORKING_COPY_CATALOG
svn up –username SVN_USERNAME –password SVN_PASSWORD

Как посчитать число строк кода с помощью PowerShell

Узнать число строк кода С# (или LOC — lines of code ) в проекте на C# можно узнать одной строчкой PowerShell:

(dir -Include *.cs -Recurse -Exclude *designer.cs, AssemblyInfo.cs | select-string "^(s*)$" -notMatch).Count

Данная команда проходит по всем .cs файлам в текущем каталоге и его подкаталогах (опция —Recurse) исключая файлы AssemblyInfo.cs и файлы дизайнеров форм. select-string «^(s*)$» -notMatch исключает из подсчета пустые строки

Как избежать повторной подписки на события в C#

В механизме событий .NET отсутствует стандартная возможность избежать повторной подписки на сообщения. То есть, при повторной подписке на один и тот же обработчик будет вызываться столько раз, сколько раз была произведена подписка на событие. Но можно реализовать такую функциональность в программе самостоятельно одним из двух способов. Первый способ — удалять обработчик через оператор -= при добавлении нового подписчика и тут же его добавлять:

public class NonDuplicateEventArgs : EventArgs
    {
      public NonDuplicateEventArgs(string message)
      {
        Message = message;
      }

      public string Message { get; set; }
    }

    protected event EventHandler<nonDuplicateEventArgs> _nonDuplicateEvent;

    /// <summary>
    /// Событие с проверкой на добавление обработчиков-дубликатов путем удаления и добавления обработчика заново
    /// </summary>
    public event EventHandler<nonDuplicateEventArgs> NonDuplicateEvent
    {
      add
      {
        // пытаемся удалить обработчик, затем добавляем снова
        _nonDuplicateEvent -= value;
        _nonDuplicateEvent += value;
      }
      remove { _nonDuplicateEvent -= value; }
    }

Второй способ заключается в том, чтобы в явном виде проверять, присутствует ли обработчик в списке вызовов:

using System.Linq;

 private EventHandler<nonDuplicateEventArgs> _nonDuplicateEventInvocList;

    /// <summary>
    /// Событие с проверкой  на добавление  обработчиков-дубликатов через GetInvocationList
    /// </summary>
    public event EventHandler<nonDuplicateEventArgs> NonDuplicateEventInvocList
    {
      add
      {
        if (_nonDuplicateEventInvocList == null ||
            !_nonDuplicateEventInvocList.GetInvocationList().Contains(value))
        {
          _nonDuplicateEventInvocList += value;
        }
      }
      remove { _nonDuplicateEventInvocList -= value; }
    }

Для того, чтобы решить, что же выбрать в своем приложении, я сделал небольшой тест. Как и ожидалось, метод с GetInvocationList для проверки одного и того же обработчика работает существенно медленнее, чем удаление и добавление — более чем в 5 раз медленнее (11.7 секунд против 2.2)

Action measureTime = (action, actionCaption) =>
{
var time = DateTime.Now;
action();
TimeSpan span = DateTime.Now — time;
Console.WriteLine(«{0} time: {1:0.000}», actionCaption,span.TotalSeconds);
};

int testCount = 10000000;

//замеряем скорость добавления одного и того же подписчика на событие
SmartEvents smartEvents = new SmartEvents();
measureTime(() =>
{

for (int i = 0; i < testCount; i++) { smartEvents.NonDuplicateEvent += OnNonDuplicateEvent; } }, "NonDuplicate"); measureTime(() =>
{

for (int i = 0; i < testCount; i++) { smartEvents.NonDuplicateEventInvocList += OnNonDuplicateEvent; } }, "NonDuplicateEvent with InvocationList"); [/sourcecode]

Однако если увеличивать количество обработчиков, то разница между двумя способами становится все менее заметной. Для 6 обработчиков разница будет несущественна, но первый метод все-таки быстрее, поэтому стоит использовать именно его.

//замеряем скорость добавления нескольких подписчиков в случайном порядке

var methods = new EventHandler[]
{
OnNonDuplicateEvent, OnNonDuplicateEvent2,
OnNonDuplicateEvent3, OnNonDuplicateEvent4,
OnNonDuplicateEvent5, OnNonDuplicateEvent6
};
testCount /= methods.Length;//чтобы долго не ждать

Random r = new Random(0);

var list = Enumerable.Range(0, testCount).Select(z => methods[r.Next(methods.Length)]).ToArray();

measureTime(() =>
{

for (int i = 0; i < testCount; i++) { smartEvents.NonDuplicateEvent += list[i]; } }, "NonDuplicate for" + methods.Length + "subscribers"); measureTime(() =>
{

for (int i = 0; i < testCount; i++) { smartEvents.NonDuplicateEventInvocList += list[i]; } }, "NonDuplicateEvent with InvocationList" + methods.Length + "subscribers"); } [/sourcecode] Полный код решения с тестами можно скачать по ссылке.

Аналог функции Shelve Pending Changes в SVN

Team Foundation Server обладает одной довольно удобной функциональностью — возможностью сохранения изменений на сервере без коммитов. Это помогает при осуществлении больших правок, когда изменения еще не готовы полностью, но хочется иметь некую промежуточную точку для себя. Выбрав Shelve Pending Changes и указав имя «полки» для изменений можно сохранить изменения, а затем при необходимости вернуть их командой Unshelve Pending Changes.

SVN в чистом виде не имеет такой возможности, но подобное поведение можно сымитировать, если использовать патчи SVN. Сделав изменения, выберите нужные файлы, для которых необходимо сделать контрольную точку и вызовите команду Create Patch (клиент Tortoise SVN).


Tortoise SVN спросит для каких файлов следует сделать патч и покажет диалог для сохранения файла патча на диске. Полученным файлом, который представляет собой обычный текстовый файл, подобный результатам работы сравнения файлов в unified diff, можно легко поделиться с коллегами. Для того, чтобы вернуть изменения, сделанные на момент создания патча следует выбрать команду ApplyPatch и выбрать файл патча.

Факты о John Skeet

По мотивам топика на stackoverlow подборка фактов о разработчике и авторе книги C# in Depth Джона Скита в стиле фактов о Чаке Норрисе .

  • Обедающие философы ждут, пока Джон Скит ест.
  • Анонимные методы и типы называются Jon Skeet.
  • Код Джона Скита не следует соглашениям о правилах кодирования. Джон Скит — сам конвенция кода.
  • Джон Скит однажды ответил на вопрос за 42 секунды до того, как он был задан.
  • Когда Джон Скит ссылается на null, null содрогается от страха
  • Дональд Кнут носит футболку «Джон Скит — мой братан»
  • Джон Скит решает задачу о коммивояжере за O(1)
  • Джон Скит единственный человек в Top 100 пользователей StackOverflow. Остальные — боты, которых он запрограммировал в промежутках между ответами на вопросы.
  • Джон скит полностью кодировал свой последний проект в Microsot Paint,
  • Когда код Джон Скита не компилируется из-за ошибки, компилятор приносит свои извинения
  • Джон Скит не использует системы контроля версий. Его код не нуждается в ревизиях.
  • Если спросить у Google «гуру программирования» Google предложит: «Возможно вы имели ввиду Jon Skeet?«
  • Может ли Джон Скит задать вопрос на который он сам не сможет ответить? Да. И он сможет на него ответить.
  • У StackOverflow есть исключение типа JonSkeetAskedAQuestionException и оно никогда не порождается.
  • Когда Джон Скит бросает исключение, ничто не может его перехватить.
  • Джон Скит может сделать так, чтобы код на Perl выглядел бы так же как и на Java
  • Джон Скит не нуждается в отладчике — он просто пристально смотрит на код, пока баг сам себя не раскроет.
  • На клавиатуре Джона Скита нет кнопки F1. Компьютер сам просит у него помощи.
  • Джон Скит использует Visual Studio чтобы прожигать DVD-диски.
  • Мозг Джона Скита думает в двоичном коде.
  • Однажды Джон Скит пошел в библиотеку. Теперь эта библиотека динамически скомпонована.

Декомпиляция Android приложений

Хочу поделиться наиболее удобным и быстрым способом получения исходного кода Android приложения.

1. Для получения apk-файла прямо из телефона можно воспользоваться бесплатным файловым менеджером Astro. В приложении ASTRO необходимо зайти в менеджер приложений, и выбрав нужное приложение нажать кнопку резервная копия, apk-файл сохранится на карту памяти в папку backups и папку, соответствующую имени пакета приложения.
AirDroid.

2. Получение dex-файла из файла приложения apk. Открыть apk-файл как zip-архив и скопировать оттуда файл classes.dex.

3. Получить jar-файл из dex-файла. Для этого можно воспользоваться проектом dex2jar. В консоли следует запустить dex2jar.bat с параметром имени dex-файла.

4. Собственно этап декомпиляции. Проект jd-gui позволяет декомпилировать jar файла даже с использованием интерфейса. После открытия файла командой File-Save All Sources указываем для архива с исходным кодом. Следует отметить, что на некоторых приложениях (например, Instagram) jd-gui вываливается с ошибкой и не сохраняет архив, хотя по отдельности файлы можно просматривать. Если это станет проблемой, то придется искать альтернативные декомпиляторы java.

Under the Hood of .NET Memory Management

Компания Redgate представила первую часть книги, посвященной проблемам менеджемента памяти. Первая часть книги «Under the Hood of .NET Memory Management» доступна для скачивания.

Автообновление приложений .NET

В этой статье рассматривается два наиболее простых способа реализации автообновления приложения .Net. Первый способ — с помощью стандартной технологии Microsoft — Click Once, второй — с помощью опенсорного компонента NET Application Updater Component.

Обновление с помощью ClickOnce

Процесс использования ClickOnce описан в этой статье. Однако, установка с помощью этой технология делает неправильный мед» не позволяет установить программу для всех пользователей, поэтому переходим к следующему пункту.

Сразу оговорюсь, что в итоге в Windows 7 хранение в папке ProgramData требует администраторских прав и в итоге, описанное здесь решение можно рассматривать только в качестве собственной реализации автообновления, исходный код которого всегда можно изменить для своих нужд.

Обновление с помощью NET Application Updater Component

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

1. Создаем новый проект Windows Forms, например с именем MySimpleSample

2. Добавляем проекты AppStart и AppUpdater. Добавляем Reference на на проект AppUpdater. В AppUpdater есть ссылка на класс AppStartConfig, лежащий в проекте AppStart, поэтому проекты AppStart и AppUpdater лучше положить на одном уровне файловой структуры.

3. Добавляем на форму компонент AppUpdater ( Со окна Toolbox-AppUpdater Components). Тут были некоторые проблемы, скорее всего это связано с обновлением проекта до Visual Studio 2010 . UpdateLog хочет писать в файл AppUpdate.log, но текущим каталогом, возвращаемым функцией GetLogFilePath является путь к Visual Studio, куда, естественно запись запрещена. Можно поправить выбор каталога на что-нибудь такое :

DirectoryInfo DI = new DirectoryInfo(Assembly.GetCallingAssembly().Location);

В классе AppDownloader нас будет ожидать еще один сюрприз — захардкоженное имя конфига «AppStart.config». Явная недоделка — исправляем хотя бы на константу для централизации.

Читать далее Автообновление приложений .NET