LINUX.ORG.RU

Избранные сообщения cryptohedge

Вопрос по реализации «динамического?» сайта

Форум — Web-development

Слово «динамического?» написано именно так, потому что я не владею в нужной мере терминологией, и, вероятно по этой причине не моуг нагуглить ответ на свой вопрос.
Почему не владею? Потому что я математик по образованию, с программированием знаком только на уровне олимпиадных задачек, и универских лаб на паскале.

Решил податься в wev development (не раздел форуме, а сферу) для интересу, и делания денег.

Почитал значит оф доки, html.net про html5, css, JS, и как мне кажется недостаточно раздуплился. Ну, то есть, всё пока понятно, но это же статические сайты, тупо с набором htm файлов, так сказать, и ссылками друг на друга. Дальше пока я не дошел. Но на самом деле деле тема не об этом...

А тема вот о чем: Для того, что бы раздуплиться некоторые советуют запилить бложик, форумчик, или еще какую ерунду. Но это не интересно. Почему? Потому что гуголь на вопрос как запилить форум выдает туторилы, общий вид которых: Вот возьми кусок кода, он, значит, логинит юзеров, вот еще кусок куда, она отвечает за что-то еще, залипи это все вместе - вот ты написал форум.

Если, кстати, вы можете посоветовать какую-нибудь литератутру на тему как перейти от умения"статических сайтов, тупо с набором htm файлов, так сказать, и ссылками друг на друга", к нормальным, полнофункциональным, блогам тем-же, не используя уже написаные кем-то шаблоны, и всё такое.

Вот в чем мне хотелось бы разобраться, и для чего была создана тема. Хоть я и некомпетентен в вопросе так называемых динамических сайтов, я примерно могу себе представить как оно должно работать. А вот что не могу... Существует значит сайтец такой depositfiles, и еще один ssdepositfiles, или {какой-то символ}depositfiles, я уже и не пропомню, пусть будет ssdepositfles. Работает он следующим образом: У нас есть ссылка на файл http://depositfiles.com/downloadfile1, на которой нам значит предлагают скачать файл с медленной скоростью за бесплатно, и быстро за деньги. Мы дописываем ss (например) к ссылке и получаем http://ssdepositfiles.com/downloadfile1 где мы можем скачать файл быстро, но за бесплатно. Мне все равно каким образом получается ссылка на быстрое скачивание, используется ли там какой-то левый премиум аккаунт, или что еще. Интересует каким образом создается ссылка http://ssdepositfiles.com/downloadfile1, она же создается в момент запроса соответствующего url от сайта, и каким образом происходит обращение к сайту depositfiles.

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

Или еще пример, если вдруг пример в этим депоситфайлсом не совсем прозрачный. Я, например, хочу написать сайт, lolinux.org.ru, у которого есть главная страница, на которой написано «Здарова!», и больше ничего. Остальные страницы каким-то образом(пока магическим для меня) генерируются на лету по такму принципу. Есть у нас ссылка на новость про Нассбаума Лукас Нуссбаум переизбран на пост лидера проекта Debian, я беру и в адресной строке изменяю URL на http://www.lolinux.org.ru/news/debian/10391232 и у меня открывается страничка, на которой тупо списком в столбик перечислены ссылки, которые встречаются в первом сообщении + ссылка на профиль топикстартера. Всё.

Как это реализовать?

 , , , whatever

Io
()

А как заставить класс выводит свое имя при создании?

Форум — Development

Это в продолжении предыдущей темы про 400 000 строк питоновского кода. Надо чтобы объекты, при создании, выводили свое имя. Это нужно для того, чтобы во всей этой простыне найти и изменить некоторый функционал.

Пока склоняюсь к написанию скрипта, который находит все *.py, при чтении файла запоминает его имя, и в __init__ сует print имя_класса.

Есть идеи по лучше?

 ,

Deleted
()

Новые сведения об эксплуатации уязвимости OpenSSL «Heartbleed»

Новости — Безопасность
Группа Безопасность

Появляется все больше хороших и плохих известий, связанных с уязвимостью “Heartbleed”.

Хорошие новости заключаются в том, что уже около трети серверов обновились и перестали быть уязвимыми. Плохая новость — по меньшей мере 600 тысяч машин остаются незащищёнными, вдобавок необходимо учесть количество встраиваемых систем, к которым уже перестали выходить обновления прошивок. Более того, зафиксированы свидетельства того, что уязвимость эксплуатировалась злоумышленниками еще в 2013 году. Компания MediaMonks обнаружила это после исследования журналов аудита за ноябрь прошлого года.

Эксперт по безопасности Брюс Шнайер назвал Heartbleed катастрофой. «По десятибалльной шкале это тянет на 11», написал он у себя в блоге. Шнайер оценивает вероятность того, что различные спецслужбы уже успели воспользоваться уязвимостью для массового извлечения приватных ключей, как близкую к единице. Следует рассматривать любой сертификат и пароль, как скомпрометированный, поскольку обнаружить следы атаки было практически невозможно. Неизвестно, где и как отзовутся нам эти утечки.

>>> Подробности

 , ,

anonymous
()

Почему стандартные питоновские библиотеки такие непродуманные?

Форум — Talks

Смотрим модуль multiprocessing. Ага, круто, вроде всё что нужно есть! Куча примитивов для синхронизации между процессами. Хотя... если присмотреться поближе, окажется, что НИ ОДИН из них не работает для разных процессов. Только с дочерними процессами и только если дочерний процесс является прямым форком текущего (python -> сторонняя хрень -> python уже никак).

Смотрим модуль tempfile. Казалось бы, ну как тут можно налажать?! А вот как:

  • Нет класса-обёртки для временных директорий.
  • Нет возможности выключить автоудаление у NamedTemporaryFile. Создали файл, форкнулись (тем же multiprocessing.Process) и получили исключение на stderr, так как глупый питон пытался удалить один и тот же файл дважды.

ctypes.util.find_library() - замечательная функция! Только вот свои пути ей не подсунуть, да и в LD_LIBRARY_PATH она не может.

Ждать в одном потоке IO одновременно с нескольких источников? Или даже ещё и сигналы ждать одновременно с этим? Да не, ну кому такое может понадобиться? Ведь всегда можно на каждый чих наплодить по 100500 потоков =). Ивентлуп? Не, не слышали.

 , ,

Deleted
()

Решил стать питонистом...

Форум — Talks

Припекло. Начал читать «Изучаем Python», документацию по Django. И решился таки устроить ликбез себе в этом плане: нашёл обучающие курсы по Python/Django от компании digitov.

Два занятия в неделю, удалённо, курс на 5 месяцев. Очень надеюсь, что он в дополнении к книгам Лутца принесёт свои плоды.

Первое вводное занятие было вчера. Ну да, просто рассказ о пайтоне, но как для новичка в кодинге и в ООП - было скучно и почти ненужно.

Из отрицательных моментов - требование портала вебинаров на флешплеер 13.0 как минимум! Он только в бете и только для обоих оффтопиков. Пришлось из под вайна смотреть.

Если будет кому интересно - могу освежать тут информацию по становлению полного нуба в Junior Python/Django Developer.

 , , , ,

le_legioner
()

Накидайте интро в экосистему Python

Форум — Development

Устроил вот себе такую гимнастику, пиляю тут проектик дома. Язык почитал, концепты понял, с GIL поплевался - успех.

Теперь пытаюсь понять взаимосвязь разных компонентов типичной экосистемы.

Мне нужно - простота, REST, web-sockets, многопоточность работы с этим говном, минимальная отдача статики без шаблонов, бонус - асинхронные клиенты к БД и всяким очередям или шинам сообщений. Нормально было бы еще пользоваться через генераторный интерфейс.

Мне не нужно - ORM, Django, шаблонизация, всякие «тяп-ляп-и-готово» рельсы, куча всякой ненужной «встроенной» поддержки перкомпиляции скриптов и ресурсов и т.д.

Чуть посмотрел Tornado, Twisted, gevent, Flask. Мне в формате запрос-ответ понравилось работать с Flask, с точки зрения API, но ведь это простой синхронный вебсервер, страдающий от GIL веб-фреймворк. Хотелось бы к нему что-то поумнее прикрутить с поддержкой веб-сокетов и многопоточностью

Какой стек порекомендовали бы?

 

vertexua
()

Помогите въехать в декораторы

Форум — Development

Капец, они меня уже достали. Это хуже, чем goto. Есть большой проект, в нем есть декоратор. Он используется в куче мест, хрен найдешь где он пределен.

И дайте годные пример этих декораторов, раз уж они есть в проекте. Читал вот это - http://habrahabr.ru/post/141411/ так и не понял нафиг оно мне надо.

 

Deleted
()

Суббота-работа :)

Галерея — Рабочие места

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

Два монитора дают +10 к комфорту в разработке. Механическая клава дополняет еще +5. Тишина и отсутствие внешних раздражителей - over 9000, т.е. бесценно. В остальном - работа как работа.

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

ЗЫ фоткал на мобилу, так что сори за качество :)

>>> Просмотр (3000x2250, 1200 Kb)

Deleted
()

конкурс по си

Форум — Development

На опеннете есть новость про то как сотрудник redhat шлёт левые патчи в ядро чтобы обойти проблемы systemd (http://www.opennet.ru/opennews/art.shtml?num=39476). Собстно, вот патчик:

http://lkml.iu.edu//hypermail/linux/kernel/1404.0/01327.html

Имхо, это ужас. Вот уж действительно товарищ принял упорин. Во-первых, он так и не понял почему редактирование /proc/cmdline это зло. Во-вторых, код ужасен, не? Неужели в сях нет способа проще вырезать подстроку? Ну и само по себе использование «магических» цифр 4 и 5 позорит код.

Так вот, конкурс по вырезанию произвольного слова из строки объявляю открытым! Учтите что слово может встречаться несколько раз.

 ,

true_admin
()

Dropbox анонсировал выпуск открытой реализации Python

Новости — Open Source
Группа Open Source

Dropbox, поставщик облачных систем хранения данных, анонсировал Pyston — JIT-компилятор для Python собственной разработки с открытым исходным кодом. Большой упор в разработке Pyston делается на увеличение производительности.

Dropbox признают PyPy, Jython и другие проекты на базе Python, но они надеются на улучшение производительности по сравнению с ними, а также сохранение совместимости с вышестоящими реализациями Python.

>>> Подробности

 , , ,

amazpyel
()

Где взять время?

Галерея — Рабочие места

subj :(

>>> Просмотр (1200x1600, 308 Kb)

qulinxao
()

Боевой набор веб-разработчика на python/flask

Форум — Web-development

Решил переименовать топик, предыдущий отличался по смыслу.

Итак:

1. какие либы/декораторы мастхев для облегчения разработки?

2. Что нынче модно использовать для ускорения верстки хтмл - ходят слухи про какой-то там синтаксический сахар.

3. Есть где готовый набор дизайнерских решений под гпл в виде html+css+js чтобы их подпилить и использовать

4. Зачем во фласке дополнительная абстракция для монгодб с возсодностью декларативно описать бд?

5. Как например во flask'е проще всего сделать авторизацию на все возможные страницы? Или придется указывать на каждой функции что требуется авторизация?

6. Что придумали для защиты от CSRF

З.ы. документацию не читал.

 ,

Siado
()

Велосипед: системный монитор с веб-интерфейсом

Галерея — Скриншоты

Запиливаю сабж. Что-то вроде учебного проекта для меня самого, чтобы немного продвинуться в разработке на python и применить, наконец, это ваше ООП. Все, что я писал раньше использовало только функции, ни одного самописного класса.

В бэкенде - python + flask, в фронтенде - uikit, jQuery и morris.js.

При маленьком экране переключается в mobile mode - меняется надпись и значок. все выстраивается в одну колонку. Ни одной картинки нет, все - иконочные шрифты либо канвас, зумить можно бесконечно и без потери качества, и на разных DPI должно выглядеть одинаково прилично.

Какой-то практической ценности проект не несет, многого недостает в нем, да и вообще таких штук наверняка навалом. Зато у меня есть класс LineChart, от которого наследуются MemChart и CoresChart и прочая объектно-ориентированная ерунда.

До окончания PyCharm Evaluation осталось 3 дня.

>>> Просмотр (1920x976, 308 Kb)

 ,

horonitel
()

Быдлокод не быдлокод?

Форум — Development

Тривиальный код, только начал и тут подумал, а может я быдлокодер ::). Если да, то почему?

На русские буковки ниже внимания не обращаем, это временно. В остальном можете конструктивно и обоснованно закидать какашками/тапками/помидорами.

Смысл поста? Нуу не знаю, может кто чего полезного скажет.

/**--------------------------------------------------------------------------**/
/**----------------------------HIMERA CORE-----------------------------------**/

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


/*enum { TRUE, FALSE }; ::) */  

enum { FALSE, TRUE };

enum { SECTION_START,
       SECTION_END,
       SECTION_NAME_START,
       SECTION_NAME_END,
       KEY_START,
       KEY_END,
       VALUE_START,
       VALUE_END
     };

/*  defauil style  */
char himera_style[]= {'{', '}', '(', ')', '[', ']', '(', ')' };

/*  default events  */
enum { EVENT_OPEN_SECTION,
       EVENT_CLOSE_SECTION,
       EVENT_OPEN_SETION_NAME,
       EVENT_CLOSE_SECTION_NAME,
       EVENT_OPEN_KEY,
       EVENT_CLOSE_KEY,
       EVENT_OPEN_VALUE,
       EVENT_CLOSE_VALUE,
       EVENT_NULL
     };
unsigned int himera_event_status=EVENT_NULL;


enum { FILE_OPEN, FILE_CLOSE};
static unsigned int himera_file_status=FILE_CLOSE;
static FILE *himera_file_point=NULL;


#define MAX_LEN_NAME_FILE 1024
static char himera_file_name[MAX_LEN_NAME_FILE];


static char * himera_file_ram=NULL;
unsigned int ramstatus=FALSE;



/* open file, save name file, save point file
 * himerafile: output to file
 *
 * FIXME: тут надо переоткрывать файл и уведомлять об этом
 *        это если по хорошему. Ане кричать что он уже открыт.
 */
void himeraopen(const char * himerafile)
{

    if(himera_file_status==FILE_CLOSE)
    {
        FILE *himerapoint;

        if((himerapoint=fopen(himerafile,"r"))==NULL)
        {
            printf("[ERROR] Нет такого файла!\n");
            exit(1);
        };
        printf("[INFO] Открытие фалла [%s]\n",himerafile);
        himera_file_point=himerapoint;
        himera_file_status=FILE_OPEN;

        for(int i=0; himerafile[i]!='\0'; i++)
        {
            if(i>MAX_LEN_NAME_FILE)
            {
                printf("[ERROR] Длинна имени файла больше MAX_LEN_NAME_FILE\n");
                fclose(himerapoint);
                exit(1);
            };
        };

        memset(himera_file_name, 0, sizeof(himera_file_name));
        strcpy(himera_file_name,himerafile);

    }
    else
    {
        if(!(strcmp(himerafile,himera_file_name)))
        {
            printf("[WARNING] этот файл уже открыт, ничего не будет сделанно\n");
            return;
        };

        printf("[INFO] закрытие старого файла\n");

        fclose(himera_file_point);
        himera_file_status=FILE_CLOSE;
        memset(himera_file_name, 0, sizeof(himera_file_name));

        printf("[INFO] освобождение ресурсов\n");

        free(himera_file_ram);
        ramstatus=FALSE;
        himera_file_ram=NULL;

        printf("[INFO] открытие нового файла \n");

        himeraopen(himerafile);



    };


}

/* print himerafile on stdio
 * print sample information himerafile
 */
void himeracat(void)
{

    if(himera_file_status==FILE_CLOSE)
    {
        printf("[WARNING] нет открытого файла \n");
        exit;
    };

    char ch;
    long long int strcount=1;
    long long int chcount;
    printf("\n**********************************\n");
    printf("[INFO] Файл на носителе file:[%s]",himera_file_name);
    printf("\n**********************************\n1: ");
    for(long long int j=0; (ch=fgetc(himera_file_point))!=EOF; chcount=++j)
    {
        printf("%c",ch);
        if(ch=='\n')
        {
            printf("%lld: ",++strcount);
        };
    };
    printf("\n**********************************\n");
    printf("lines: [%lld] chars [%lld]",strcount,chcount);
    printf("\n**********************************\n");

    /*---------------------------------------------------------------------*/
    if(ramstatus==TRUE)
    {
        char ch;
        long long int strcount=1;
        long long int chcount;
        printf("\n**********************************\n");
        printf("[INFO] Файл в памяти file:[%s]",himera_file_name);
        printf("\n**********************************\n1: ");
        for(long long int j=0; (ch=fgetc(himera_file_ram))!=EOF; chcount=++j)
        {
            printf("%c",ch);
            if(ch=='\n')
            {
                printf("%lld: ",++strcount);
            };
        };
        printf("\n**********************************\n");
        printf("lines: [%lld] chars [%lld]",strcount,chcount);
        printf("\n**********************************\n");
    };
    /*---------------------------------------------------------------------*/
}

/*загружает весь файл в память*/
void himeraload(void)
{

    if(ramstatus==TRUE)
    {
        /*  printf("[WARNING] попытка повторной загрузки, файл уже загружен!\n");
            return;
        */
        printf("[INFO] обновление копии файла в памяти\n");
        free(himera_file_ram);
        ramstatus=FALSE;
        himera_file_ram=NULL;
    };

    setbuf(stdout,NULL);
    printf("[INFO] загрузка файла [%s] старт \n",himera_file_name);

    /* узнаём размер файла */
    int size_file=0;
    for(long long int count=0; fgetc(himera_file_point)!=EOF; size_file=++count);



    /* выделяем память под файл*/
    himera_file_ram = calloc(size_file, sizeof(int));/* FIXME: int vs char? */

    if(himera_file_ram=NULL)
    {
        printf("Ошибка при распределении памяти\n");
        exit(1);
    }

    /*копируем файл в память*/
    int ch,count=0;
    while((ch=fgetc(himera_file_point))!=EOF)
    {
        himera_file_ram[count]=ch;
    };
    printf("[INFO] загрузка файла [%s] загруженно \n",himera_file_name);

    ramstatus=TRUE;
}

/*сохраняет текущий открытый изменённый файл на носитель*/
//himerasave()
/*находит искомую секцию или ключ */
//himeragrep()
//himeratype()


void himeraget_int(int * var,const char  section, const char key)
{

};

void himeraget_float(float * var,const char  section, const char key)
{

};

void himeraget_char(char * var,const char  section, const char key)
{

};


/*free resource and exit himera*/
void himeraclose(void)
{

    printf("[INFO] освобождение ресурсов \n");

    fclose(himera_file_point);
    himera_file_status=FILE_CLOSE;
    memset(himera_file_name, 0, sizeof(himera_file_name));
    free(himera_file_ram);
    ramstatus=FALSE;
    himera_file_ram=NULL;
}

 ,

Dron
()

Пистон что-то компилит и запускает в моём доме!

Форум — Talks

Привет, Лор.

Понадобилось мне вечером в пятницу порешать эти ваши дифуры с запаздыванием. В интернетах говорят, что в матлабе есть функция dde23 для этого. Запустил я Sage, потыкал автокомплит, — ничего похожего, к великому разочарованию. Нашёл пару проектов по теме: pydde и pydelay. Оба древние, в репах нет. Ок, ставлю руками — успешно. Запускаю ipython2, импортирую, вызываю, а оно мне плюётся:

ImportError: /home/username/.cache/scipy/python27_compiled/sc_168f4b81ca07c2cb64108491ef85113b5.so:
failed to map segment from shared object: Operation not permitted

Ну я потупил какое-то время, а потом понял, что у меня /home с noexec смонтирован. Перемонтировал — заработало.

У меня один вопрос: зачем так жить? Был ещё второй, но я снёс всю эту прелесть, ведь я свободный от задротства человек!

Засим выдыхаю и иду спать. Чего и тебе желаю, $(whoami).

 , , ,

d
()

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

Новости — Novell
Группа Novell

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

Сейчас kGraft находится на стадии работающего прототипа, требующего доработки. После доработки созданные в рамках проекта наработки будут предложены для включения в состав основной ветки ядра Linux. Компоненты, работающие на уровне ядра, будут открыты под лицензией GPLv2, а выполняемые в пространстве пользователя утилиты, позволяющие создавать патчи к ядру, - под лицензией GPLv3. Средства наложения патчей на базе kGraft ограничены заменой целиком функций и связанных с ними констант. Патч формируется при помощи специального инструментария, на основе анализа исправлений исходных текстов выявляющего подлежащие замене функции и формирующего исходных код модуля ядра с реализацией патча. Cгенерированный модуль загружается в ядро штатными средствами, как и любой другой модуль ядра, после чего выполняет все необходимые действия по внесению изменений в ядро без прерывания работы системы.

>>> Подробности (на английском языке)

 ,

mbivanyuk
()

Задачки по программированию

Форум — Talks

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

Вобщем кто что может сказать?

З.Ы. Может кто ещё что может сказать по поводу этих задачек и таких тестов? Кроме «не нужно» ;)

 , , ,

aleks13
()

объясните fork

Форум — Development

Есть простой скрипт fork.py

#!/usr/bin/python

import os

print "start"
if os.fork() == 0:
    print "fork"
print "finish"
yur4@homebox:~ $ ./fork.py 
start
finish
fork
finish

А вот вывод через пайп неожиданный.

yur4@homebox:~ $ ./fork.py |cat
start
finish
start
fork
finish

 ,

Yur4eg
()

Релиз FreeBSD 10

Новости — BSD
Группа BSD

Сегодня, 20 января 2014, согласно расписанию разработки, вышел FreeBSD 10. Этот релиз можно назвать самым громким среди остальных - произведена миграция некоторых ключевых компонентов/механизмов системы. А среди них:

1) Замена основного способа компиляции программ и исходных кодов. Теперь для установки портов вместо компилятора GCC будет использоваться clang, распространяющийся по BSD-подобной лицензии. Если необходимо использовать GCC - его можно скачать из системы портов.
2) Распространяющийся в базовой поставке DNS-сервер BIND (named) был заменен на Unbound. Если нужен BIND - его тоже всё еще можно скачать из портов.
3) Произведен переход на следующее поколение менеджера пакетов - средства установки скомпилированных программ, удаления, также разрешения зависимостей: утилиты с префиксом pkg_, а именно pkg_add, pkg_create, pkg_delete, pkg_info, pkg_updating, pkg_version были заменены на pkg/pkgng

( читать дальше... )

Оригинальный список изменений

Выбор и скачивание образа

>>> Подробности

 ,

reprimand
()

Можно ли купить концентрированный сок в розницу (подробности ниже, т.к. кое-какой можно)?

Форум — Talks

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

Поинтересовался, можно ли купить данные концентраты простым смертным. Удалось купить вишнёвый и клубничный в специализированном магазине для самогонщиков, причём по не очень выгодной цене (литр готового 50% нектара обошёлся где-то в 55 рублей). Однако нужны других нужных мне вкусов (например, яблоко и апельсин) там нет.

Нашёл вот этот ресурс: http://www.tdtriada.ru/koncentriroannyy_sok_v_butylkah-_1_, написал им, они сказали, что минимальная партия — 6 бутылок одного вкуса (это выйдет 42 литра готового сока), однако, как утверждают, работают и с физическими лицами, не являющимися ИП.

Помимо экономии данный продукт нужен мне для приготовления газированного сока. Кстати, Linux тут притом, что в США газированный яблочный сок называют шипучим сидром, а данный напиток фигурирует в My Little Pony.

Неизвестно ли кому-нибудь тут о возможности приобретения продукта более мелкими партиями?

 

Ttt
()