LINUX.ORG.RU

Сообщения deep-purple

 

CSRF-токен костыль?

Не буду углубляться что есть CSRF. Кто в теме, тот знает.

Сабж вот в чем. Обычно везде в формах или ссылках пихают токен защиты. Мол, токена нет, или он не валидный — не буду ничо делать.

Ага. Но есть ли смысл в этом токене? Ведь достаточно проверить реферер (домен и внутренний путь предыдущей страницы). Например:

http://domain.tld/admin/users/remove?id=22
Достаточно проверить что реферер был таким (псевдо-регулярка в конце):
http://domain.tld/admin/users(\?page=\d+)?
Т.е. удаление (в данном примере — пользака) возможно только со страницы просмотра списка пользаков.

А что касается угона кук и подделки реферера — это, извините, уже не CSRF, а ССЗБ, раз твои данные уже угнали.

Дискас!

 , , ,

deep-purple
()

А вы говорите — сайты плохие..

 , ,

deep-purple
()

«Ероша», Позорище, СтрелкИ и туалетные удобства

Чего только не случается пока едешь на работу. И вот, сегодня, наслучалось. Дабы не забыть - запечатлею.

Картина маслом раз:

Еду значт в метро, стою. Передо мной сидит парниша. Волосы у него аки пакля на вид, взъерошенные. Там же, на пучке его сена нахлобучены наушники. Называются «V-moda», оть, даже пруф имеется: http://v-moda.com/headphones/ И все бы хорошо, да он их, так приодел, что читалось оно по русски, а еще и фантазия разыгралась: http://s14.postimg.org/c1h65s44x/V_Moda_Crossfade_M_100_White_Silver_35512458...

Картина маслом два:

Еду в метро дальше. Дед читает сегодняшнюю(?, пруфа не будет, картинко не нагуглилось) газету «Метро». Заголовок такой: «Сорок лет назад дети умерли от жевачки». Я деду говорю - позорище же - даже до газет уже неучи добрались. Всякие у них жЕвачки. Не хватает еще жИвачки и жУвачки.

Картина маслом три:

Вышел из метро. Навстречу чешет какой-то поц. - У Вас сигаретки не будет? - Вон в магазине есть, показываю рукой - 10 метров расстояние. - Да я бросаю.. - Ну так и не расслабляйся раз бросаешь. - И денег нет.. - И как это отменяет твое предыдущее утверждение?

Картина маслом четыре:

В этой истории правда только то, что в наш мужской туалет приходит какая-то тётка мыть свои чайно-кофейные кружки. Остальное я выдумал. Ну, поехали..

Захожу я в наш общественный туалет. Смотрю - тётка кружку намывает.

- Что вы делаете в мужском туалете? - Кружку мОю. - Так идите в женский мыть. - А мне в этот ходить ближе. - Мне тоже в женский ближе, но я туда не хожу. При вас даже в голос не пёрнуть. Вам самой то не стыдно? - Что Вы себе позволяете? Еще и учить меня будете? Я Вас старше! - Вам в лучшем случае требуется психолог, в худшем - психиатр.

В меня летит кружка, уворачиваюсь. Делаю ББПЕ леща по уху и выталкиваю тётку за шкибот из туалета. Проходит секунд тридцать. Я уже сижу на троне в одной из кабинок. Слышу как с грохотом распахивается дверь.

- Эй мужик! - Где мужик? - Ты о****?

И начинает ломиться в мою кабинку. Я говорю - Щас в 112 позвоню - узнаем кто тут чего ел. Звоню, говорю - приезжайте скорее, человеку спокойно посрать не дают. Чего хотят? Понятия не имею. Кто это? Да, судя по поведению, это какой-то Оскар по фамилии Блятель.

Кароч, устал я писАть, и работать надо )) Допишу позже, если ссылка редактирования еще не пропадет.

З.Ы.: Добавьте тег «туалет».

 , , ,

deep-purple
()

Меня доконала эта помойка (*.mp3)

Для всех:

Если ты не работал руками (апи либ не в счет) с *.mp3 форматом — проходи мимо. Однако, если будет нормальная мысль - я весь внимание.

Для тех кто «в теме»:

Всякие ID3, LYRICS, AiD и прочую шелуху я скипнул.

И вот, парсю mp3-фреймы. Если ориентироваться на позиции sync-word-ов (ессно проверяю и все остальные данные в этих 4-х чарах) найденных в файле, то, можно вычислить размер каждого фрейма. Ага, я то вычисляю, но, эти размеры, а равно и их позиции, а равно и общее кол-во фреймов, не совпадает с тем кол-вом фреймов найденных libmp3lime (mad я пока не пробовал, надо будет поковырять).

Есь такая формула:

if (!header->layer) {
    header->frame_size = (size_t) (((12000 * header->bitrate / header->samplerate) + header->padding_bit) * 4);
} else {
    header->frame_size = (size_t) ((144000 * header->bitrate / header->samplerate) + header->padding_bit);
}

Но она выдает размеры (300-8000 байт) не равные ни тому что я напарсил по синк-вордам, ни тому что напарсил libmp3lime.

А вот еще интересно, libmp3lime имеет в своем апи ф-цию «hip_decode1()» она, как написано, должна принимать на вход ОДИН мп3-фрейм, но, эксперименты дали понять, что ей вообще похер, что ты туда пихаешь, лишь бы не менее ~1200 байт, т.е. читай из файла и все.

Но мне то надо обрыскать весь файл и узнать точное число RAW-PCM фреймов закодированных в мп3.

Недавно видел тут в новостях про какой-то плеер чот тип того: «более-точное определение длительности мп3-трека», я смотрю, не один я с этой херней совладать не могу )))

UPD: А, да, кратко по проблеме. Кто подскажет где скопипастить:

1) правильную формулу вычисления длины мп3-фрейма. 2) правильный алгоритм выпарса и валидации этих самых фреймов.

Либы? Либы я копаю, и даже несколько великов нашел на гитхабе. Но там либо помойка, костыли и говнокод, либо поддержка одного лайера.

 , ,

deep-purple
()

В какой прожке можно вменяемо набросать план дома?

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

Вот тогда надо наверное подумать за дом. Она уже давно лазит, ищет готовые решения, но там все - не то.

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

Ну а конечная цель - либо она меня уломает, либо я докажу несостоятельность всей этой идеи.

Посоветуйте прогу, пожалуйста. Под онтоп конечно же.

 , ,

deep-purple
()

Все просто ))

Вчера вбросил знакомым одну простую задачку, которая слегка ввела их в ступор. Дай-ка и сюда вброшу.

Необходимо оптимизировать (переходы по адресу, кол-во условий/вызовов/переменных) и сделать лаконичным, понятным, читаемым, без лапши, копипасты, расширяемым для большего кол-ва значений за наименьшее кол-во телодвижений, следующий кусочек псевдокода:

// value can be: a,b,c,d,e,f or g
myLongLongNameOfVariable = getName();
if (myLongLongNameOfVariable == 'a' || myLongLongNameOfVariable == 'b' || myLongLongNameOfVariable == 'c' || myLongLongNameOfVariable == 'd' || myLongLongNameOfVariable == 'e' || myLongLongNameOfVariable == 'f') {
    forAllNonDefault();
    if (myLongLongNameOfVariable == 'a') {
        forA();
    } else if (myLongLongNameOfVariable == 'b') {
        forB();
    } else if (myLongLongNameOfVariable == 'c') {
        forC();
    } else if (myLongLongNameOfVariable == 'd') {
        forD();
    } else if (myLongLongNameOfVariable == 'e') {
        forE();
    } else if (myLongLongNameOfVariable == 'f') {
        forF();
    }
} else {
    // last (here 'g') value context (default)
    forDefault();
}

Ваши предложения?

 ,

deep-purple
()

Миграция на новую структуру БД

Вопрос касается только SQL. Есть две сущности: проекты и шаблоны.

Старая структура: все проекты могли использовать любой из шаблонов. Но в конкретный момент естественно только один.

Там две таблицы:

projects -> id, title, template_id
templates -> id, title

Новая структура: у каждого проекта должен быть свой собственный набор шаблонов. Активным может быть только один шаблон из «личного» набора.

Теперь нужны три таблицы:

new_projects -> id, title, current_template_id
new_templates -> id, title (, old_id)
new_projects_templates -> project_id, template_id

Некоторые проекты используют одинаковые шаблоны. Первым шагом я «размножил» шаблоны и перебил им автоинкрементные айдишники. Однако, временно сохранил old_id, поэтому он и указан в скобочках, ведь после всех манипуляций я удалю это поле через ALTER TABLE.

Вот запрос втыкающий «размноженный» результат в новую табулю шаблонов:

SET @cnt := 0;
INSERT INTO new_templates (
    SELECT
            (@cnt := @cnt + 1) id,
            sub.title,
            sub.old_id
        FROM (
            SELECT
                    t.title,
                    t.id old_id
                FROM templates t
                LEFT JOIN projects p
                    ON p.template_id = t.id
                WHERE p.id IS NOT NULL -- кастыль для шаблонов без привязки к проектам
                ORDER BY t.id ASC -- чтобы вставка была в старом порядке создания шаблонов
        ) sub
);
Ну а теперь никак не сообразу как запилить еще два шага: 2) вставка проектов в новую таблицу проектов с корректной привязкой к шаблону. 3) вставка в таблицу связи проекты-шаблоны.

Вот так выглядит попытка тестовой выборки:

-- счетчик не сброшен
-- в нем максимальный айдишник после вставки
-- теперь декрементируем его
SELECT
    (@cnt := @cnt - 1),
    p.id      project_id,
    nt.old_id nt_old_id,
    nt.id     nt_id
    FROM projects p -- из старой таблицы проектов
    LEFT JOIN new_templates nt -- из новой таблицы шаблонов
        ON nt.id = @cnt
Естессно выдает он полную хрень. Как правильно то запилить?

 , ,

deep-purple
()

Кто сломал кодировку?

Звиняйте, но, какой мудадяй это сделал:

http://s17.postimg.org/dqpm2en73/charset.png

 ,

deep-purple
()

Хрень творится с вимом

Есть в вимрц такое:

" New vertical split
map <Home> :vsp<cr><C-w>l<esc>:e ./<cr>
imap <Home> <esc>:vsp<cr><C-w>l<esc>:e ./<cr>

" New horizontal split
map <End> :sp<cr><C-w>j<esc>:e ./<cr>
imap <End> <esc>:sp<cr><C-w>j<esc>:e ./<cr>

Вот этот <esc> перед :e ./ я добавил тока что, думал поможет.

Так вот, открываю я какой-либо файл. Затем открываю вертикальный сплит, хожу спокойно вверх-вниз по списку, и, ИНОГДА, в 50% случаев, при нажатии на энтер по выбранной директории (м.б. переход на уровень выше или провалиться внутрь) навигация в этом сплите соскакивает в какой-либо открытый левее сплит, причем гасит там номера строк и выдает такой статус внизу: «directoryname [Not edited][readonly] 10 lines --100%-- » где 10 lines это позиция (10 строка) директории в просмотре ":e", хотя курсор уже переброшен в какой-то из левее расположенных сплитов. Да, перескакивает всегда в разный, может в соседний ближайший, а может и в самый левый сплит.

Что за хрень?

 ,

deep-purple
()

Модели данных

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

 	ILP32 	LP64 	LLP64 	ILP64
char 	8 	8 	8 	8
short 	16 	16 	16 	16
int 	32 	32 	32 	64
long 	32 	64 	32 	64
long long 	64 	64 	64 	64
size_t 	32 	64 	64 	64
pointer 	32 	64 	64 	64

Один чел мне говорит «Проверяй, если инт 8 байт, то юзай шорт». Однако, педивикии говорят что ляликс юзает LP64, а оффтоп LLP64, не понимаю где чел встретил ILP64 (или какую-то другую?).

Растолкуйте от чего отталкиваться? Какие модели данных надо учесть хотябы для самых распространенных случаев?

В самом идеале, конечно, свою прилагу я предполагаю запускать на линукс/фря/оффтоп 32/64. Вопрос вообще возник от того, что читаю бинарку из файла, и там может быть BE, а может быть LE byte order, плюс еще размер самих типов, и надо как-то это все перелопачивать под то, на чем я запущен в конкретный момент.

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

 

deep-purple
()

Многопоточное приложение

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

Вот, я перехватываю сигналы, например SIGINT. Кроме сигналов есть т.н. неисправимые ошибки в процессе выполнения.

При перехвате сигнала или появлении какой либо неисправимой ошибки я дергаю shutdown() завершение проги. Там все закрывается и освобождается.

Однако, естественно, что фатал эррор бывает вызывается из какого-либо потока, или даже, сигнал перехватывается «как-бы в контексте» потока. В таком случае вылезают понятные нативно, но не понятные в причинах касяки.

Собственно я сделал как. При старте проги получаю в (main контексте) thread_main = pthread_self() и устанавливаю threads_err = 0 Тогда в той части которая генерирует ошибку я проверяю в каком контексте она была вызвана (pthread_self() != thread_main), если это не в родительском main-потоке, то устанавливаю threads_err = 1 а цикл в main следит за состоянием этой переменной, и если ошибка есть, то вызывает shutdown()

Кажется мне, что это ГК. Или все же это нормальная практика? Нет? А как правильно?

 , , ,

deep-purple
()

Копирасты, mp3, libmp3lame, libmad

Что-то я прошляпил. Есть какие-то подводные камни при использовании этих либ или самого формата в своем поделии?

Пока конечно только ковыряю, внедряю. Да, будет опенсорсный GPL v.3. Именно за несрастуху с лицензиями я и хотел бы уточнить.

Это вообще типа не обязательная опция, просто для поддержки формата, но хотелось бы её включить. С ворбисом та насколько я знаю все в поряде в этом плане.

 ,

deep-purple
()

Поясните за структуры

Так собирается:

typedef struct {
    int a;
    int b;
} foo;
static struct {
    int x;
    foo **foos;
} bar;
А так ние:
static struct {
    int a;
    int b;
} foo;
static struct {
    int x;
    foo **foos;
} bar;
Причем ругается уже ниже, в такой строке: bar.foos = NULL;

error: ‘struct <anonymous>’ has no member named ‘foos

Почему?

 , ,

deep-purple
()

Как корректно освободить ресурсы snd_pcm?

Простой пример:

#include <alsa/asoundlib.h>

int
main()
{
    snd_pcm_t *dev;

    snd_pcm_open(&dev, "default", SND_PCM_STREAM_PLAYBACK, 0);
    snd_pcm_close(dev);

    return 0;
}

Валгринд такой:

==20334== LEAK SUMMARY:
==20334==    definitely lost: 0 bytes in 0 blocks
==20334==    indirectly lost: 0 bytes in 0 blocks
==20334==      possibly lost: 65,525 bytes in 2,020 blocks
==20334==    still reachable: 298 bytes in 6 blocks
==20334==         suppressed: 0 bytes in 0 blocks
==20334== Reachable blocks (those to which a pointer was found) are not shown.
==20334== To see them, rerun with: --leak-check=full --show-reachable=yes
==20334== 
==20334== ERROR SUMMARY: 116 errors from 116 contexts (suppressed: 4 from 4)
--20334-- 
--20334-- used_suppression:      2 dl-hack3-cond-1
--20334-- used_suppression:      2 glibc-2.5.x-on-SUSE-10.2-(PPC)-2a
==20334== 
==20334== ERROR SUMMARY: 116 errors from 116 contexts (suppressed: 4 from 4)
Без вызова snd_pcm_close() имеем 117 errors from 117 contexts.

Эти ошибки реально мешают тестировать свой говнокод.

UPD:

Т.к. это все продолжение вот этого: Как правильно запилить звуковой буфер с кроссфейдером? то кастану наверное снова waker и i-rinat там помогли понять что к чему и тут можт помогут.

 , , ,

deep-purple
()

Где почитать HOWTO по реализации (circular/ring) буфера?

Нужно именно про буфер с несколькими «читателями»

Не могу нагуглить. Попадается все время только где читает один поток. А мне нужно чтобы читали несколько.

Сам я додумываю только что должно как-то определяться по последнему, самому медленному читателю. Тогда не только пишущий поток должен ориентироваться на позицию чтения самого медленного, но и остальные читатели должны «не торопитьтся». Верно ли?

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

 ,

deep-purple
()

Посоветуйте либу для парсинга/генерации JSON

Посоветуйте какую-нибудь небольшую либу для парсинга/генерации JSON. Не бросайтесь ссылками просто так, нагуглить я и сам могу - либ куча. Хотелось бы увидеть рекомендации.

Покажите какую сами юзали (или даже написали свою). Почему выбрали именно её? Как она себя показала?

 ,

deep-purple
()

Теперь про сокеты

Собсно:

Получаю дескриптор сокета (socket(AF_INET...), биндю его, листю его. Подключаюсь телнетом, отправляю текст, сервер его получает, все чики-пуки.

Но, после того как вырубаю сервер через Ctrl+C, при повторном его запуске он фейлится на бинде. А через несколько запусков «отходит». В данный момент запилил с goto retry_connect; с sleep(3); но этж кастыль еще какой.

Да, я уже загуглил. Есть SO_REUSEADDR но про него говорят нехорошее вот тут.

У меня таки вопрос - а как эту «проблему» решали вы?

 , , ,

deep-purple
()

Хабровброс?

 ,

deep-purple
()

Запутался в указателях на указатели

0) Выходные, чо ))

1) Возможно то, чего я хочу уже есть, а я и не знаю. Поэтому опишу задачу.

Хочу ф-цию которая:

char *x;
fn(&x, "abcde", 2);
printf("X: %s\n", x); // X: ab

2) Даже если такая есть, всеравно хочу понять как оно работает. Поэтому пишу свою.

void
fn(char **dst, const char *src, const size_t len)
{
    size_t src_len = strlen(src);
    size_t dst_len = (len >= src_len ? src_len : len);
    *dst = (char *) malloc(dst_len + 1);
    // часть закомментирована, падает на **dst++
    while (dst_len-- /*&& (**dst++ = *src++)*/);
    // так работает
    *dst = "ljhg";
    // еще ж в конец *dst надо '\0' воткнуть
}

ЧЯДНТ?

 ,

deep-purple
()

Не понял прикола fopen()

#include <stdlib.h>
#include <errno.h>
#include <stdio.h>


int
main(int argc, char **argv)
{
    FILE *fp1 = NULL;
    FILE *fp2 = NULL;

    char *abs1 = "/test.bin";
    char *abs2 = "/home/test.bin";

    fp1 = fopen(abs1, "r");
    if (!fp1) {
        printf("Cannot open file %s (%d)\n", abs1, fp1);
    } else {
        printf("Success open file %s (%d)\n", abs1, fp1);
    }

    fp2 = fopen(abs2, "r");
    if (!fp2) {
        printf("Cannot open file %s (%d)\n", abs2, fp2);
    } else {
        printf("Success open file %s (%d)\n", abs2, fp2);
    }

    return 0;
}

Файлов нет, ни того ни другого. При указании «abs1» отрабатывает Success, вот выхлоп:

Success open file /test.bin (8671248)
Cannot open file /home/test.bin (0)

Чо за прикол? ЧЯДНТ?

 

deep-purple
()

RSS подписка на новые темы