Showing posts with label programming. Show all posts
Showing posts with label programming. Show all posts

Friday, August 27, 2010

УДИВЛЕНИЕ!

Открыть текстовый файл:

fsrc = fopen(argv[1],"rt");

Определить его размер:

long fsize(FILE *f)
{
long pos, end;
pos = ftell(f);
fseek(f,0,SEEK_END);
end = ftell(f);
fseek(f,pos,SEEK_SET);
return end;
}


Выделить памяти:

long src_size = fsize(fsrc);
char *buf = new char[src_size+1];

Зачитать в нее собственно текст:

fread(buf,src_size,1,fsrc);

Последний символ файла не ноль, поэтому пририсовываем к буферу ноль и дальше работаем с ним, как с длинной строчкой текста:

buf[src_size] = 0;
parser.add_source(buf);

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

Я-то знаю, почему это так.

Tuesday, November 10, 2009

статистики и статистического анализа пост

мое личное впечатление при первом взгляде (да и при втором тоже и спустя год) на сает onetwo.tomsk.ru такое: "ДА ВЫ ЗАПАРИЛИ УЖЕ СО СВОИМ СРАНЕ ГРАЙНДКОРОМ, МЕТАЛКОРОМ, ДЭТОМ И СКРУДЖЕМ!!!1"
безответственные выкрики с места - лучший способ навязать свое мнение собеседнику, но в этот раз я решил теоретически обосновать данные наблюдения. тем более, что это не так уж сложно. формул, во всяком случае, придумывать никаких не пришлось.
последовательно выполнил в своей командной строке следующие свои команды, ура:

for /L %i in (1,1,6000) do wget -O temp%%i.html http://onetwo.tomsk.ru/group/main/%i/

for %i in (*.html) do grep -o -E "&style=[0-9]+.>[^<>]+" %i >> styles-list.tmp

gawk -f makehist.awk styles-list.tmp | sort -r -n >hist.txt

в результате выполнения этих заклинаний, файл hist.txt стал содержать в себе отсортированные по убыванию частоты встречаемости музыкальных стилей музыкальных групп, музыкальные альбомы которых были выложены на музыкальном саете onetwo.tomsk.ru.

2924 байта текста из файла hist.txt копипастим в эксель, строим гистрограмму, вдумчиво на нее смотрим, делаем далеко идущие выводы, пишем статью, защищаем диссертацию, ура.

топ-50 стилей:


p.s.
makehist.awk (добрый кирилл любезно согласился мне этот файл написать, потому что я в awk ничерта не понимаю):

BEGIN{FS=">"}
{ar[$2]=ar[$2]+1}
END{for (i in ar) {print ar[i] " \"" i "\"" }}


p.p.s
вопрос, на который я еще не придумал ответ: дело в том, что аудиофилы живущие на этом саете, не удовлетворяются наличием 138 стилей музыки, и многим группам ставят в соответствие несколько стилей. тогда как здесь, на гистограмме, отображена частота встречаемости стилей вообще. как бы мне связать из с группами и отобразить понагляднее, а?

Tuesday, June 2, 2009

выстрелил тут себе в ногу.
у меня есть класс который конвертирует говно в специальное концентрированное говно.

class Compressor{
public:
Compressor();
int work(const char *src,char *dst);
private:
int uber_data;
int settings;
char *govnobuf;
};
Compressor *compressors = new Compressor[CPU_COUNT];

ну и они, экземпляры, там запускаются в разных потоках одновременно.
все работает, никаких вопросов.
и тут пришло время прикрутить второй вид концентратора SuperCompressor2.
полиморфизм и отделение интерфейса от реализации спасут нас, решил я и немедленно сделал так:

class AbstractCompressor
{
public:
virtual int work(const char *src,char *dst) = 0;
};

class Compressor: public AbstractCompressor{ ... };

class SuperCompressor2: public AbstractCompressor
{
public:
SuperCompressor2();
int work(const char *src,char *dst);
private:
int settings2;
char *govnobuf;
char *interimbuf;
};

ага.

AbstractCompressor *compressors;
if(application.settings.what_compressor_to_use)
compressor = new Compressor[CPU_COUNT];
else
compressor = new SuperCompressor2[CPU_COUNT];

очень круто. скомпилял, и внутренне радуясь своей сообразительности, запустил.
радость пропала ровно через двадцать секунд, когда программа упала с AV, при вызове

compressor[i].work(src,dst);

расстроился и вернул все обратно. почему? потому что при обращению к массиву компилятор вычисляет смещение исходя из определения оного, то есть получается

(AbstractCompressor *)((char *)compressor + i*sizeof(AbstractCompressor))

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

Thursday, November 27, 2008

радости жизни на работе.


n = new_passes_counter;
counter += new_passes_counter;
new_passes_counter -= n;

а и еще вот такие конструкции периодически встречаю:

for(i=0; i < N; i++){
foo();
if(i < N && !p){
bar();
}
blabla();
if(i < N){
blablabla();
}
}

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

Tuesday, April 15, 2008

как посчитать размер папки в репозитории

паритесь с чекаутом из свн-а?
не знаете сколько весит каталог, который вы хотите залить к себе и боитесь скачать слишком много внешнего траффика?
воспользуйтесь новым инженерным тоником от нашей компании!
используя его, вы сможете с точностью до байта узнать размер интересующего вас каталога и верно оценить свои возможности!

@echo off
echo sample usage: svn_count_bytes.cmd http://svn.xiph.org/trunk/ao/
echo returns full size of this folder in bytes (without externals)
if "%1" == "" (set url=.) else (set url=%1)
echo obtain files list...
svn list -R --xml %url% >files.tmp
echo counting...
set sum=0
for /f "tokens=2* delims=>" %%i in ('grep "[0-9].[0-9]*" -o files.tmp') do set /a sum = sum + %%i
echo %sum% bytes
del files.tmp

Thursday, March 13, 2008

на досуге читал исходники ogg theora и иже с ними.

декодер

/* never forget that globals are a one-way ticket to Hell */
ogg_sync_state oy;
ogg_page og;
...
#ifdef _WIN32 /* We need to set stdin/stdout to binary mode on windows. */
/* Beware the evil ifdef. We avoid these where we can, but this one we
cannot. Don't add any more, you'll probably go to hell if you do. */
_setmode( _fileno( stdin ), _O_BINARY );
_setmode( _fileno( stdout ), _O_BINARY );
#endif
...
/*Yes, yes, we're going to hell.*/
#if defined(_WIN32)
#include < io.h>
#endif


енкодер
/* You'll go to Hell for using globals. */
...
/* You'll go to Hell for using static variables */
...

Wednesday, December 5, 2007

памятники архитектуры


while(!exit_flag){
pframe = get_src_frame(×tamp);
encoder->set_dst_addr(out_buffer[idx]);
encoder->encode_frame(pframe,×tamp);
pdst = encoder->get_frame(&size);
deliver(out_buffer[idx],timestamp);
}

когда вы кодируете мупег, там есть такая особенность, которая называется reordering delay. одним из следствий этой особенности является то, что запихав в енкодер кадр и его время, на выходе мы можем ничего не получить или получить, но другой совсем кадр, который был целых восемьдесять миллисекунд назад. логично, что вместе с этим кадром из прошлого нам надо получить его размер и его же время.
так как же блядь так получилось, что размер закодированного кадра я получаю при вызове функции get_frame, адрес буфера я задаю заранее функцией set_dst_addr (а возвращаемое значение get_frame вообще никого не интересует и это даже компилятор понимает), а время мне записывают в timestamp при вызове функции encode_frame на место переданного ей туда времени текущего кадра?
щас все переделаю.

Thursday, September 13, 2007

почему я больше не читаю rsdn


А>1). Сравните: "VeryLongNameOfSomeVariable" и "very_long_name_of_some_variable". IMHO второе намного читабельнее. Всё-таки в русском языке мы разделяем слова пробелами, а не изменением регистра букв.

Ты видать на php долгое время писал, вот тебе и читабельнее Да и памяти вторая строка больше займет


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

Tuesday, September 11, 2007

дураки и циклы do { } while

в некоторых coding-style rules встречаются примечания типа "не использовать цикл do-while!". и я всегда недоумевал, зачем так вот строго? нормальная такая конструкция, очень удобная в определенных случаях..
пока я не встретил проект в котором все циклы перечисления были сделаны, блядь, через do {} while.
даже не просто все циклы перечисления, а ВСЕ циклы вообще.

ну то есть, надо например перебрать все макроблоки в слайсе. что делает это сцуко кодер?
int pos_y = 0;
do{
int pos_x = 0;
do{
// lot of stuff
// ...

// two pages below
pos_x += 16;
}while(pos_x < width);
pos_y += 16;
}while(pos_y < height);


я догадываюсь, из-за чего это он так сделал и если мои подозрения оправдаются, сцуко буду бросаться гавном и требовать о разжаловании имярека в младшие черпальщики.
и сцуко, запретить циклы do-while насовсем в корпоративном кодинг стиле!!

Thursday, September 6, 2007

написать тетрис

написать игру тетрис, которая бы давала очки не только за заполненные линии, но и за другие составленные игроком фигурки.
то есть, например, сгружает пользователь фигурки, сгружает, и тут у него получается лесенка из четырех или даже пяти кубиков - программа немедленно говорит "стрит!" и дает игроку тыщу очков. а если кубики одного цвета, то две тыщи.

Thursday, May 10, 2007

printf в гуевом приложении

Вот я пишу гуевое приложение. Мне в нем приходится использовать много (дохуя) постороннего кода, который валит отладочную информацию используя одновременно калбэки, printf и OutputDebugString. Если калбэки я ему предоставляю свои и всё, что валится в отладочную консоль - я вижу, то инфа, выведенная через printf, пропадает и никак мне ее не прочитать.
А переписывать весь этот код не то что бы нельзя, но неохота.
Способ решения я придумал такой:

// создаем консоль
AllocConsole();
// перенаправляем c-runtime вывод в нее
freopen("CONOUT$","w",stdout);


p.s. в шестом вижуальнике работает.