-
Список говнокодов пользователя burdakovd
Всего: 12
-
+122
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
while (!requestedTermination)
{
// ...
// тут 130 строк кода...
// ...
if (requestedTermination)
{
break;
}
else
{
// to prevent excess CPU usage
Thread.Sleep(100);
}
}
requestedTermination - Property, изменяемое другим потоком
Мораль: не пишите длинные циклы - к концу цикла забудете, какое у него было условие завершения.
burdakovd,
16 Декабря 2011
-
−92
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
-- async IO operations
-- op1.asyncRun(cb) - execute op1, and call cb(op1_result) after op1 completion
-- op1 * g - new async operation which will execute op1.asyncRun(), then execute g(op1_result).asyncRun() and return op2_result
-- op1 .. op2 - the same, but ignore result of op1. Will execute op1.asyncRun(), then op2.asyncRun() and return op2_result
private.binder = {
__mul =
function(op1, g)
local op = {
asyncRun =
function(cb)
op1.asyncRun(
function(op1_result)
g(op1_result).asyncRun(cb)
end
)
end
}
setmetatable(op, private.binder)
return op
end,
__concat =
function(op1, op2)
return op1 * function(op1_result) return op2 end
end,
__metatable = 1
}
-- примеры использования:
-- (Chatter.IO.Log("tic") .. Chatter.IO.Sleep(1000) .. Chatter.IO.Log("tac") .. Chatter.IO.Sleep(1000) .. Chatter.IO.Log("toe")).asyncRun(function() end)
-- (Chatter.IO.GetTime * Chatter.IO.Log .. Chatter.IO.Sleep(1000) .. Chatter.IO.GetTime * Chatter.IO.Log).asyncRun(function() end)
Lua.
burdakovd,
07 Июля 2011
-
+163
- 1
- 2
- 3
- 4
- 5
- 6
- 7
int F(x)
{
if (.chto-to) v.push_back(.koe-chto.);
int ind = somefunc(x);
for each y in x.childs
v[ind].res += F(y);
}
Не говнокод, но пример того, как из std::vector можно выстрелить себе в ногу
Комментарий автора кода ( http://codeforces.ru/blog/entry/1719#comment-32824 ):
такая штука получала крэш на компиляторе жюри, из-за того что сначала вычислялся адрес v[ind].res затем вызывалась снова F, которая пушбекает в вектор v, и может тем самым заставить вектор перевыделить память, тем самым адрес вычисленный ранее становился инвалидным.
я этот баг долго не мог найти, потомучто студия генерила нормальный код, не вызывающий креша
burdakovd,
18 Апреля 2011
-
+135
- 1
^(?:[^<>]*<[^<>]+>)+?[ \n\t]*Вопрос №\d+\:[ \n\t]*((?:<[^<>]+>[^<>]*)+?)(?:<table>|<table [^<>]*>)[ \n\t]*(?:<tr>|<tr [^<>]*>)[ \n\t]*(?:<td>|<td [^<>]*>)[^<>]*(?:(?:(?:(?:<div>|<div[ \n\t]*[^<>]*>)|</div>|<div[ \n\t]*?/[ \n\t]*?>)|(?:(?:<p>|<p[ \n\t]*[^<>]*>)|</p>|<p[ \n\t]*?/[ \n\t]*?>)|(?:(?:<font>|<font[ \n\t]*[^<>]*>)|</font>|<font[ \n\t]*?/[ \n\t]*?>)|(?:(?:<html>|<html[ \n\t]*[^<>]*>)|</html>|<html[ \n\t]*?/[ \n\t]*?>)|(?:(?:<body>|<body[ \n\t]*[^<>]*>)|</body>|<body[ \n\t]*?/[ \n\t]*?>)|(?:(?:<head>|<head[ \n\t]*[^<>]*>)|</head>|<head[ \n\t]*?/[ \n\t]*?>)|(?:(?:<span>|<span[ \n\t]*[^<>]*>)|</span>|<span[ \n\t]*?/[ \n\t]*?>)|(?:(?:<style>|<style[ \n\t]*[^<>]*>)|</style>|<style[ \n\t]*?/[ \n\t]*?>)|(?:(?:<title>|<title[ \n\t]*[^<>]*>)|</title>|<title[ \n\t]*?/[ \n\t]*?>)|(?:(?:<br>|<br[ \n\t]*[^<>]*>)|</br>|<br[ \n\t]*?/[ \n\t]*?>)|(?:(?:<img>|<img[ \n\t]*[^<>]*>)|</img>|<img[ \n\t]*?/[ \n\t]*?>)|(?:(?:<meta>|<meta[ \n\t]*[^<>]*>)|</meta>|<meta[ \n\t]*?/[ \n\t]*?>))[^<>]*)*Вариан
Продолжение (8 килобайт, сюда не влазит): http://pastie.org/1750060
Регулярка безусловно генерится, но всё равно ГК.
burdakovd,
03 Апреля 2011
-
−172
- 1
time.strftime('%Y/%m/%d', time.localtime(time.time()+86400))
Вычисление завтрашней даты.
В день перехода на зимнее время этот код не будет работать.
До сих пор не знаю, как это сделать правильно.
burdakovd,
05 Января 2011
-
+131
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
orig_labels = sort(unique(Y));
Y_new = Y;
new_labels = 1:length(orig_labels);
for i=1:length(orig_labels)
Y_new(find(Y==orig_labels(i)))=Inf;
Y_new(isinf(Y_new))=new_labels(i);
end
Y = Y_new;
Matlab. Масштабирование. То есть типа вектор [100 230 400 300 230] переводится в [1 2 4 3 2].
Можно было сделать внутри цикла "Y_new(Y == orig_labels(i)) = i".
Побочным эффектом стало то, что если Y имеет элементы с типом не double, а int32 к примеру, то Inf превращается в maxint32, проверка isinf() возвращает false и код внезапно не работает.
burdakovd,
16 Декабря 2010
-
+163
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
std::vector<double> WBuffer;
std::vector<double> CleanWBuffer;
std::vector<Color> PixelBuffer;
std::vector<Color> CleanPixelBuffer;
void Scene3D::ClearBuffers()
{
const size_t n = static_cast<size_t>(ScreenSize[0] * ScreenSize[1]);
memcpy(&*(WBuffer.begin()), &*(CleanWBuffer.begin()), n * sizeof(*(WBuffer.begin())));
memcpy(&*(PixelBuffer.begin()), &*(CleanPixelBuffer.begin()), n * sizeof(*(PixelBuffer.begin())));
}
Быстрая очистка буферов.
CleanWBuffer предварительно заполнен 0.0, CleanPixelBuffer предварительно заполнен нужным цветом.
Можно было воспользоваться std::fill, но оно работает в несколько раз дольше.
Пришлось так вот лезть в потроха std::vector. Доставляют подряд идущие & и *.
burdakovd,
12 Ноября 2010
-
+157
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
void Scene3D::DrawTriangle(const Point3D &A, const Point3D &B, const Point3D &C, const Color& color)
{
// ---------------------------------------------------------------------------------------
// вспомогательные вычисления
// нормаль
const Vector3D& n = (B - A) ^ (C - A);
// ...
// центр треугольника
const Point3D& medium = (A + B + C) / 3.0;
Руки как-то привыкли const TypeName& variableName набирать в определении параметров методов.
И случайно набралось такое (строки 6, 11)
Операторы (+, -, ^, /) над векторами возвращают Vector3D, не const Vector3D&.
Заметил только через полгода, и всё это время оно почему-то работало, и даже ворнингов не было.
Но такое ведь не должно работать!
Результат вычисления в правой части присваивания структура, то есть она возвращается в стеке. Если бы я присвоил её какой-то локальной переменной, для которой выделена память в стеке текущей функции, то она бы перед удалением скопировалась в локальную переменную. А так получается что ссылка (n, medium) указывает куда-то на стек, где временно хранится возвращенное оператором значение. И при следующем вызове любой функции эта область стека должна перезаписаться.
burdakovd,
12 Ноября 2010
-
−165
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
def getrows(c):
return \
sum( # суммируем по категориям
map(
lambda category:
sum( # суммируем по itemid
map(
lambda itemidset:
sum( # суммируем по itemstring
map(
lambda itemstring:
map(
lambda info:
transaction(category, itemstring, info),
itemidset[itemstring].values()
),
itemidset.keys()
),
[]),
c[category].values()
),
[]
),
("completedAuctions", "failedAuctions", "completedBidsBuyouts")
),
[]
)
Залез в свой старый скрипт, генерирующий отчеты, думал кое-что подправить...
Увидел одну из функций (эту) и решил лучше забить тут что-то править хД
Причины такого ужаса - наверно отсутствие явной типизации в питоне и средств рефакторинга (rename variable, extract method, ...) в "IDE"
burdakovd,
27 Октября 2010
-
+75
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
StringUtils.join(
Collections2.transform(Arrays.asList(ArrayUtils.toObject(data)),
new Function<Byte, String>() {
@Override
public String apply(final Byte from) {
return "0x" + Integer.toHexString(from);
}
}), " ")
data имеет тип byte[]
в питоне это было бы ' '.join(map(hex, data))
burdakovd,
18 Октября 2010