Visual Studio Achievements Beta — или как стать программистом 80 уровня

Появилось шуточное расширение Visual Studio Achievements для Visual Studio, позволяющее прокачивать свои программистские навыки и позволяющее делиться «достижениями». Как только получен соответствующий значок им можно похвастаться в FaceBook и Twitter.

Помимо применения расширения «just for fun» и наличия довольно бессмысленных достижений(«Написать иерархию классов с наследованием в 10 уровней») или даже грустных («Программировать ночью в пятницу или субботу»), расширение может быть вполне полезным при начальном освоении Visual Studio, например, позволяет узнать о функции «Organize Usings». Но пока все-таки список не очень большой, надеюсь, авторы не остановятся на достигнутом.

Когда использовать Parallel.ForEach, а когда PLINQ

Мой перевод статьи «When Should I Use Parallel.ForEach? When Should I Use PLINQ?», опубликованный ранее на Хабрахабре.

Введение

Обычно, при оптимизации программы для многоядерных компьютеров первым шагом является выяснение возможности разделения алгоритма на части, выполняющиеся параллельно. Если для решения задачи необходимо параллельно обрабатывать отдельные элементы из большого набора данных, то первыми кандидатами станут новые возможности параллельности в .NET Framework 4: Parallel.ForEach и Parallel LINQ (PLINQ)

Parallel.ForEach

Класс Parallel содержит метод ForEach, представляющий собой многопоточную версию обычного цикла foreach в C#. Подобно обычному foreach, Parallel.ForEach выполняет итерации над перечислимыми данными (enumerable), но с использованием множества потоков. Одна из более часто используемых перегрузок Parallel.ForEach выглядит следующим образом:

public static ParallelLoopResult ForEach<tsource>(
			 IEnumerable</tsource><tsource> source,
			 Action</tsource><tsource> body)

Ienumerable указывает на последовательность, по которой нужно выполнить итерации, а Action body задает делегат, вызываемый для каждого элемента. Полный список перегрузок Parallel.ForEach можно найти здесь.

PLINQ

Родственный с Parallel.ForEach PLINQ представляет собой модель программирования для паралелльных операций над данными. Пользователь определяет операцию из стандартного набора операторов, включающих в себя проекции, фильтры, агрегирование и т.д. Подобно Parallel.ForEach PLINQ достигает параллельности, разбивая входную последовательность на части и обрабатывая элементы в разных потоках.

В статье выделяются различия между этими двумя подходами к параллельности. Разбираются сценарии использования, в которых лучше всего использовать Parallel.ForEach вместо PLINQ и наоборот.

Выполнение независимых операций

Читать далее Когда использовать Parallel.ForEach, а когда PLINQ

Вырезаем снежинки он-лайн

В GisMeteo.ru сделали новогодний подарок своим пользователям. Прямо на сайте можно виртуально вырезать старые добрые бумажные снежинки. Созданной снежинкой можно легко поделиться, как прямой ссылкой, так и через социальные сети, а также посмотреть и оценить результаты других людей. Вот, например, что может получиться 🙂

Восстановление счетчиков производительности Windows 7

По каким-то магическим причинам некоторые части механизма счетчиков производительности могут быть нарушены. Проявлением этого дефекта будет сообщение «Cannot load Counter Name data because an invalid index » was read from the registry.» при попытке чтения счетчиков производительности средствами .NET Framework. Если на форме находится компонент, то исключение сгенерируется прямо в функции InitializeComponent после вызова PostInit на компоненте отображения счетчиков производительности, что можно считать откровенной недоработкой, так как в этом случае скорее нужно было бы просто отображать текст с ошибкой.

Для того, чтобы починить счетчики производительности мне хватило выполнения команды:

 lodctr /R

Если это не помогает, то нужно обновить счетчики производительности .NET, для этого вызвать команду (Путь указан для 64-битной версии .NET 4, придется указать путь, актуальный в конкретной операционной системе.

 lodctr " c:WindowsMicrosoft.NETFramework64v4.0.30319corperfmonsymbols.ini"

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

Cсылки по теме:

Reaper — устранение проблемы рендера звука в оффлайн-режиме

При сохранении итоговой звукозаписи в секвенсоре Reaper (операция Render — Full-speed Offline) из проекта, использующего различные VST плагины и инструменты, можно столкнуться с различными артефактами и деградацией качества звука, некоторые ноты могут полностью пропадать. Это связано с тем, что по умолчанию в Reaper отключена опция Options-Preferences-VST- Inform plug-ins of offline rendering state. Казалось бы, что значение по умолчанию должно быть с включенным offline-режимом, так как в других секвенсорах (Cubase, Sonar, Ableton Live и т.д.) не возникает подобных проблем с экспортом звука. Но разработчики Reaper не включили эту функцию по умолчанию, одним из возможных объяснений этого является то, что некоторые плагины ведут себя по-разному и используют различные настройки в on-line и offline режимах.

Поиск похожих сайтов

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

Например, вот какие сайты по мнению similarsitesearch.com похожи на 3dnews.ru.

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

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

Напоследок, поищем альтернативы Wired.com:

Moreofit вполне справляется с задачей.

Уроки экономики на коровах

Вольный перевод заметки A Cow based Economics Lesson

Социализм.

У Вас есть две коровы. Одну из них Вы отдаете соседу.

Коммунизм

У Вас есть две коровы. Государство отбирает обоих и дает вам молоко

Фашизм.

У Вас есть две коровы. Государство отбирает обоих и продает вам молоко.

Нацизм

У Вас есть две коровы. Государство отбирает обоих и убивает Вас.

Бюрократизм

У Вас есть две коровы. Сначала государство говорит, чем нужно кормить и когда нужно доить коров. Затем оно требует совсем не доить коров. Государство отбирает обоих, убивает одну, доит вторую, а молоко сливает в канализацию. Кроме того, государство требует, чтобы Вы продолжали заполнять отчеты о коровах, несмотря на то, что их у Вас уже нет.

Традиционный капитализм.

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

Капитализм венчурного шотландского банка

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

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

Вы продаете одну корову, чтобы подкупить выборы президента США, у Вас осталось 9 коров.

Читать далее Уроки экономики на коровах

20 самых популярных ответов программистов на вопрос, почему их программа не работает

  • 20. Хм, странно…
  • 19. Такого еще никогда не случалось.
  • 18. Как могло так получиться?
  • 17. Все работало вчера.
  • 16. Должно быть, проблема с железом.
  • 15. Что вы сделали, чтобы программа упала?
  • 14. Должно быть, что-то не так с данными, которые вы ввели
  • 13. Я не изменял этот модуль уже несколько недель!
  • 12. Похоже, что у вас неправильная версия программы.
  • 11. Просто неудачное стечение обстоятельств.
  • 10. Я не могу протестировать все.
  • 9. Это не может быть источником такой ошибки.
  • 8. Программа работает, просто она не была протестирована.
  • 7. Похоже, что кто-то изменил мой код.
  • 6. Вы проверили свою систему на вирусы?
  • 5. Хоть программа и не работает, как она вообще?
  • 4. На вашей системе нельзя пользоваться этой версией программы.
  • 3. Почему вы думаете, что это должно работать именно так? (это не баг, это фича)
  • 2. Где вы были, когда программа обрушилась?

И победитель:
1. Программа работает… на моем компьютере.

via thenetworkadministrator.com

Почему MatLab fft выдает разные результаты для строк и столбцов

Небольшое недоумение возникает при попытке сравнения результатов быстрого преобразования Фурье (функция fft) от вещественных столбцов и строк — полученные векторы комплексно-сопряженные. Это связано с тем, что операция транспонирования в Matlab для матриц с комплексными числами не просто транспонирует, а конвертирует все значения в комплексно-сопряженные. Поэтому, чтобы БПФ работало «ожидаемо», нужно пользоваться оператором поэлементного транспонирования .’

isequal(fft(x').',fft(x)) % Возвращает истину

Ошибка "Access to modified closure"

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

 IEnumerable<char> query = "Not what you might expect";

 foreach (char vowel in "aeiou")
    query = query.Where(c => c != vowel);

    Console.WriteLine("Error:");
    foreach (char c in query)
    Console.Write(c); // Not what yo might expect

Казалось бы, все хорошо (если, конечно, не установлен Visual Assist или Resharper, тогда мы увидим предупреждение «Access to modified closure»), однако, после выполнения программы мы получим строчку «Not what yo might expect», удалилась только последняя буква. Чтобы понять, что произошло, нужно вспомнить, во что преобразуется цикл foreach, а преобразуется он в следующее:


IEnumerable<char> vowels = "aeiou";
using (IEnumerator<char> rator = vowels.GetEnumerator())
{
  char vowel;
  while (rator.MoveNext())
  {
    vowel = rator.Current;
    query = query.Where (c => c != vowel);
  }
}

На каждом шаге цикла мы добавляем в качестве условия проверку на неравенство переменной vowel. «Ленивый» оператор where захватывает одну и ту же переменную, поэтому при обращении к последовательности IEnumerable проверка и будет проходить на неравенство только одной переменной, получившей последнее значение. Для того, чтобы получить ожидаемый результат, необходимо добавить внутри цикла локальную переменную — тогда каждый раз будет захватываться новая переменная с новым значением.


foreach (char vowel in "aeiou")
{
  char cur = vowel;
  query = query.Where(c => c != cur);
}