Archive for the ‘Программизм’ Category

MsTest: CollectionAssert и HashSet

Печально, но дотнетовский System.Collections.Generic.HashSet<T> не имплементит System.Collections.ICollection. Из-за этого МС-овский же Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert.AreEquivalent() безбожно не компилирутеся.

var hashSet = new HashSet();
CollectionAssert.AreEquivalent(new string[]{}, hashSet);

Error 125 The best overloaded method match for 'Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert.AreEquivalent(System.Collections.ICollection, System.Collections.ICollection)' has some invalid arguments.

Вот такая хрень компилируется, но, что неудивительно, падает при попытке привести хэшсет к ICollection. Это ещё печальнее:

var hashSet = new HashSet();
CollectionAssert.AreEquivalent(new string[]{}, (ICollection)hashSet);

System.InvalidCastException: Unable to cast object of type 'System.Collections.Generic.HashSet`1[System.String]' to type 'System.Collections.ICollection'.
Вот такая ерунда работает ок, но выглядит как костыль (собственно, им и является):

var hashSet = new HashSet();
CollectionAssert.AreEquivalent(new string[]{}, new List<string>(hashSet));

Приходится писать свой хелпер.

Мир несовершенен, друзья. Любите его, чините его, и он будет лучше.

Хочется странного

Недавно захотелось, чтобы в командную строку чёрного властелина тотального командира или же просто любую другую командную строку можно было вбить, например, такое:

c:\>g как готовить черепах

и в браузере открывалась соответствующая страница гуглопоиска. Такая вот бесполезная фича.

Сделать это очень просто. Правильно, однако, сделать — гораздо сложнее, но овчинка выделки не стоит. В общем, создаём где-нить в PATHe (кстати, про PATH) скрипт g.cmd c примерно таким содержанием:

start "C:\Program Files\Opera\opera.exe" "http://www.google.com/search?q=%*"

Вот и готово. Понятно, что у Анонимуса путь к своему браузеру может отличаться. В расовых линуксах можно вообще писать просто firefox, например, без полного пути. Есть также косяк с тем, что запросы с кавычками работать не будут. Фиксить его нецелесообразно, впрочем, поэтому сойдёт и так.

GCJ 2009 R1 Advancers

По традиции публикую неофициальный список беларусов, участвующих в очередном раунде Google Code Jam. Полужирным выделены товарищи, прошедшие в R2. Read more...

Google Code Jam 2009 Qualification Round

Только что принял участие в сабже. Результаты будут завтра. Задачки несложные. Кто хочет — можно присоединяться, потому что регистрация открыта будет ещё почти сутки.

UPD: Прошёл квал, решив все задачки. Первый раунд — на следующих выходных.

Товарищ [info]Антон подсказал остроумное решение первой задачи (Alien Language). Вкратце напомню её суть.

Дан набор слов языка и несколько шаблонов вида типа такого: abc(xy)d(gf). Буквы в скобках означают, что на месте этих скобок может быть любая из этих букв. То есть, шаблону выше удовлетворяют следующие слова: abcxdg, abcydg, abcxdf и abcydf. Необходимо найти для каждого из заданных шаблонов, сколько слов из словаря им соответствуют.

Задача при заданных там ограничениях решается в лоб. Самый крутой способ (который я узнал от Антона) — это преобразовать шаблон в регексп, заменив круглые скобки на квадратные :) Тогда задача решается буквально в пару строчек на руби путем проверки каждого слова словаря на соотвествие этому регекспу. Любуйтесь короче:

  l, d, n = gets.split(' ').map { |w| w.to_i }
  dictionary = Array.new(d) { |i| gets.chomp }
 
  1.upto(n) do |test_no|
    pattern = gets.chomp.gsub('(', '[').gsub(')', ']')
    regex = Regexp.new(pattern)
    count = dictionary.select { |word| regex =~ word }.size
    puts "Case ##{test_no}: #{count}"
  end

Duck Typing

Читая унылый хабр, наткнулся на забавный перевод термина Duck Typing — утипизация. А чё, остроумно.

Duck Typing

Тупой вопрос про буфер обмена

Можно ли в винде, например, скопать в буфер обмена пустую стоку? Чтобы при вставке вместо выделенного текста именно она невозбранно и вставлялась? А в этих ваших линуксах и прочих системах?

Если да, то как? Если нет, то почему?

Переключение раскладки по капслоку в виндовс

Есть софтина, без которой я с давних пор очень неуютно себя чувствую за компом. Я с давних пор являюсь апологетом расово-верной ОС Виндовс. А так как в ней нету возможности повесить переключение русской/английской раскладок на клавишу, например, Caps Lock, как это можно сделать в этих ваших линуксах, то приходится использовать всякие сторонние тулзы.

Я много лет использую ту, что написал дружище DikMax. Респект ему и уважение.

Плюсы переключения по капслоку:

  1. Можно убрать значок EN/RU с панели. Диод на клаве отлично его заменяет.
  2. Нажимать одну кнопку удобней чем две.
  3. Одной бесполезной клавишей на клавиатуре меньше.

Ну а вообще — дело привычки. Я привык очень быстро :)

Качаем здесь (28 KB).

5 cпособов сделать агрегацию строк в SQL Server'е

Иногда возникает необходимость осуществить агрегацию строк в SQL запросе, то есть, по такому набору данных:

GroupId Item
1 AAA
2 IS
5 OMG
2 WHAT
2 THE
1 This

получить примерно такой:

GroupId ItemList
1 AAA,This
2 IS,WHAT,THE
5 OMG

MySQL, например, для таких целей обладает встроенной функцией GROUP_CONCAT():

SELECT GroupId, GROUP_CONCAT(Item SEPARATOR ",") AS ItemList
FROM Items

В MS SQL Server'e такой функции нету, поэтому приходится извращаться. Перед тем, как приступить, сделаем скрипт для создания тестовой таблицы:

CREATE TABLE Items(GroupId INT, Item NVARCHAR(10))
 
INSERT INTO Items(GroupId, Item)
SELECT 1 AS GroupId, 'AAA' AS Item
  UNION ALL
SELECT 2, 'IS'
  UNION ALL
SELECT 5, 'OMG'
  UNION ALL
SELECT 2, 'WHAT'
  UNION ALL
SELECT 2, 'THE'
  UNION ALL
SELECT 1, 'This'

Итак, начнем.
Read more...

Вордпресс-плагин для ссылок на участников TopCoder'а

Недавно написал плагин TCUsers для вордпресса чтобы можно было удобно референсить топкодерские хэндлы пользователей. Пользоваться можно так [tcuser color="red"]Petr[/tcuser], так [tcuser color="yellow"]DNNX[/tcuser] или так [tcuser]unrateduser[/tcuser].

На выходе получаются кликабельные ссылки на топкодер-юзеров, раскрашенные модными цветами: Petr, DNNX, unrateduser. Плагин большей частью содран с аналогичного LJUsers автора Jenyay. Этот же товарищ на своей домашней странице разобрал подробно код своего плагина — весьма познавательно для тех, кто хочет научиться писать WordPress-плагины.

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

Как выучить SQL

Самый простой, эффективный и быстрый метод выучить язык SQL — тренироваться. Скажу откровенно: можно много умных книжек, статей и документации прочитать по SQL, но без практики знания наверняка будут малоприменимыми. Так вот, самый лучший способ тренироваться — решать упражнения по SQL на сайте sql-ex.ru. Задачи там начинаются с очень простых и постепенно усложняются. Я, честно говоря, до последней пока не добрался — завис на 137-м упражнении.

Да, еще немаловажен тот факт, что на сайте есть рейтинг участников и система выдачи сертификатов участникам, решившим определенное количество задач. Я считаю, что качество сертификата c sql-ex позволяет быть уверенным в глубоком понимании языка SQL его обладателем. Кроме того, обладание сертификатом «All requirements» поднимает ЧСВ на несколько пунктов.

« Older Entries