Страницы

Поиск по вопросам

четверг, 28 февраля 2019 г.

Какую функцию использовать для подстановки значений в строку запроса?

Как сделать тоже самое на PHP?
`API_URL = "https://api.similarweb.com/v1/website/{site}/" \ "total-traffic-and-engagement/visits?api_key={api_key}" \ "&start_date={start_date}" \ "&end_date={end_date}" \ "&main_domain_only=false" \ "&granularity={granularity}".format( site='cnn.com', api_key=MY_API_KEY, start_date="2017-09", end_date="2017-10", granularity="monthly" )`


Ответ

Ну, как вариант с помощью eval
$string = 'API_URL = "https://api.similarweb.com/v1/website/{site}/" \ "total-traffic-and-engagement/visits?api_key={api_key}" \ "&start_date={start_date}" \ "&end_date={end_date}" \ "&main_domain_only=false" \ "&granularity={granularity}".format( site="cnn.com", api_key=MY_API_KEY, start_date="2017-09", end_date="2017-10", granularity="monthly" )';
$site = 'test.ru'; $api_key = 'superkey';
$start_date = 'ONE'; $end_date = 'TWO';
$granularity = 'variable';
preg_match_all('#\{(.*?)\}#', $string, $matches, PREG_SET_ORDER);
foreach ($matches as $m) { eval('$string = str_replace($m[0], $'.$m[1].', $string);'); }
echo $string;
В результате данные в формате {параметр} заменяются на значение переменной $параметр
В итоге получаем такую строку:
API_URL = "https://api.similarweb.com/v1/website/test.ru/" \ "total-traffic-and-engagement/visits?api_key=superkey" \ "&start_date=ONE" \ "&end_date=TWO" \ "&main_domain_only=false" \ "&granularity=variable".format( site="cnn.com", api_key=MY_API_KEY, start_date="2017-09", end_date="2017-10", granularity="monthly" )
UPD: Решение чуть попроще:
$string = str_replace('"', '\"', preg_replace('#\{(.*?)\}#i', '\$$1', $string)); eval('$string = "'.$string.'";');
echo $string;
Или вместо функции str_replace возьмем addcslashes для экранирования кавычек:
eval('$string = "'.addcslashes(preg_replace('~\{(.*?)\}~i', '\$$1', $string), '"').'";');
echo $string;

Slick slider свайп не работает

Всем привет.
Есть slick-slider на странице целых 4 .
Проблема очень экстрординарная так как все слайдеры работают кроме 3-го.У всех прописан один и тот же стиль
$(function(){ try { $( 'section.cinema .slider, section.news .slider, section.shopping .slider, section.restaurants .slider' ).slick({ dots: false, infinite: true, speed: 300, centerMode: false, variableWidth: true, swipe:true, slidesToShow: 3, slidesToScroll: 1, responsive: [ { breakpoint: 400, settings: { slidesToShow: 1, slidesToScroll: 1 } }, { breakpoint: 768, settings: { slidesToShow: 2, slidesToScroll: 1 } },
{ breakpoint: 1140, settings: { slidesToShow: 3, slidesToScroll: 1 } } ] }); } catch( $e ){} });
section.cinema .slider, section.news .slider section.shopping .slider слайдер которое не работает section.restaurants .slider
Третий работает только стрелками а swipe не работает.У других все работает. Очень прошу помогите.
Мои попытки.
1.Вместо $( 'section.cinema .slider, section.news .slider, section.shopping .slider, section.restaurants .slider' ). этого проста написать $(.slider' ).
2.Изменить версию слайдера я поставил 1.8.0 также 1.9.0 тоже не помогло
3.Также добавить для каждого класса свою функцию слайдера тоже не помогло
Правка.
Я пробовал добавить версию 1.5.9 тогда свайп работал только один раз
Ссылка на слайдер slick


Ответ

А не работает всё потому-что разная ширина слайдов, у всех остальных слайдеров всё в display:block + img и соответственно variableWidth параметр отрабатывает верно, а в 3-м варианте background-image + flex-wrap: wrap
Это те изменения которые вам необходимо ввести для корректной работы в css и scripts.min.js . На 3-м слайдеры стоит display:flex , скиньте его в display:block, в целом flex не нужен и уж если используешь flex то flex-wrap:wrap в слайдере не должно быть, элементы в 3 ряда падают. Также убираем variableWidth: true. Тестируйте, у меня всё завелось.
$(function () { try { $("section.cinema .slider, section.news .slider, section.restaurants .slider").slick({ dots: false, infinite: true, speed: 300, centerMode: false, variableWidth: true, slidesToShow: 3, slidesToScroll: 1, draggable: true, touchMove: true, swipe: true, touchThreshold: 100, swipeToSlide: true, responsive: [{breakpoint: 400, settings: {slidesToShow: 1, slidesToScroll: 1}}, { breakpoint: 768, settings: {slidesToShow: 2, slidesToScroll: 1} }, {breakpoint: 1140, settings: {slidesToShow: 3, slidesToScroll: 1}}] }) } catch ($e) { } }); $(function () { try { $("section.shopping .slider").slick({ dots: false, infinite: true, speed: 300, touchThreshold:1, slidesToShow: 3, slidesToScroll: 1, draggable: true, touchMove: true, touchThreshold: 100, swipeToSlide: true, responsive: [{breakpoint: 400, settings: {slidesToShow: 1, slidesToScroll: 1}}, { breakpoint: 768, settings: {slidesToShow: 2, slidesToScroll: 1} }, {breakpoint: 1140, settings: {slidesToShow: 3, slidesToScroll: 1}}] }) } catch ($e) { } }); $(document).ready(function () { if ($.fn.customScrollbar) $(".shops-list").customScrollbar(); selectActiveMapArea() }); $(document).on("pjax:success", function () { selectActiveMapArea() }); function selectActiveMapArea() { if ($(".map svg") !== undefined) { $(".map svg a").on("click", function (e) { $.pjax({container: "#p0", url: $(this).attr("href")}); e.preventDefault(); return false }); if ($("h1").attr("data-shop-id") !== undefined) { $(".map svg a[data-shop-id=" + $("h1").attr("data-shop-id") + "] polygon").addClass("active") } } } $(window).on("scroll", function () { var body = $("body"), position; if (body.attr("data-parallax") === undefined) body.attr("data-parallax", body.css("background-position-y")); position = parseInt(body.attr("data-parallax")) - parseInt($(window).scrollTop()) / 5; body.css({"background-position-y": position}) }); $(document).on("click", ".search", function (e) { if ($(this).hasClass("active")) { if ($(e.target).attr("name") !== "search") { if ($(this).find("input").val() === "") { $(this).removeClass("active"); $("nav .mini-logo").removeClass("hide") } else $(this).closest("form").submit() } } else { $(this).addClass("active"); $("nav .mini-logo").addClass("hide") } }); $(document).ready(function () { stickyNavTop = $("nav").offset().top - 15; stickyNav(); $(window).scroll(function () { stickyNav() }); $["ui"]["autocomplete"].prototype["_renderItem"] = function (ul, item) { return $("

  • ").data("item.autocomplete", item).append(item.label).appendTo(ul) } }); var stickyNavTop; function stickyNav() { var header = $("header"); var logo = $(".logo > a > img"); if ($(window).scrollTop() > stickyNavTop) { header.css({height: header.innerHeight()}); $("nav").addClass("sticky"); logo.hide(); $(".c").addClass("container"); if (window.innerWidth > 766) { $('.navbars').addClass('navbar-reverse content-center'); $('.second').addClass('auto-width'); $('.actions').addClass('display-none'); // let elem = document.querySelector("rect[data-shop-id='" + document.querySelector("h1[data-shop-id]").getAttribute("data-shop-id") + "']"); // if (elem === null) // { // elem = document.querySelector("polygon[data-shop-id='" + document.querySelector("h1[data-shop-id]").getAttribute("data-shop-id") + "']"); // } // elem.setAttribute("stroke", "red"); } } else { $("nav").removeClass("sticky"); logo.show(); $(".c").removeClass("container"); if (window.innerWidth > 766) { $('.navbars').removeClass('navbar-reverse content-center'); $('.second').removeClass('auto-width'); $('.actions').removeClass('display-none'); } } } #w1 {display:block !important}

    c# множество асинхронных HttpWebRequest [дубликат]

    На данный вопрос уже ответили: Увеличить скорость парсера 1 ответ Пытаюсь сделать множество асинхронных запросов HttpWebRequest. Подготовил мини тест:
    class Program { static void Main(string[] args) { Test(); Console.ReadLine(); }
    public static async void Test() { for (int i = 0; i < 10; i++) { int val = i; await Task.Run(() => WR(val)); } }
    static async void WR(int msg) { Console.WriteLine(msg + " begin");
    string url = "https://stackoverflow.com"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; var response = (HttpWebResponse)await Task.Factory.FromAsync (request.BeginGetResponse, request.EndGetResponse, null);
    Console.WriteLine(msg + " status code: " + response.StatusCode); Console.WriteLine(msg + " end"); } }
    Но вот что получилось:
    0 begin 1 begin 2 begin 3 begin 4 begin 5 begin 6 begin 7 begin 8 begin 9 begin 0 status code: OK 0 end 1 status code: OK 1 end
    А после 1 end вообще ничего не происходит. Где-то через 30 секунд в output вылазит:
    The thread 0x6634 has exited with code 0 (0x0). The thread 0x5620 has exited with code 0 (0x0). The thread 0x4d08 has exited with code 0 (0x0). The thread 0x39b8 has exited with code 0 (0x0). The thread 0x3454 has exited with code 0 (0x0). The thread 0x99c has exited with code 0 (0x0). The thread 0x6be0 has exited with code 0 (0x0).
    Но никаких ошибок в дебаге не вываливается. Подскажите где я ошибся и как исправить?
    UPDATE: Затык происходит при запуске в Visual Studio. Интересно что с включенным Fiddler все работает нормально.


    Ответ

    Переписал немного ваш код. Все прекрасно работает
    void Main() { Test(); Console.ReadLine(); }
    public static async Task Test() { var tasks = new List(); for (int i = 0; i < 10; i++) { int val = i; var task = WR(val); tasks.Add(task); } await Task.WhenAll(tasks); }
    static async Task WR(int msg) { Console.WriteLine(msg + " begin");
    string url = "https://stackoverflow.com"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; var response = (HttpWebResponse)await Task.Factory.FromAsync (request.BeginGetResponse, request.EndGetResponse, null);
    Console.WriteLine(msg + " status code: " + response.StatusCode); Console.WriteLine(msg + " end");
    response.Dispose(); }
    Вывод
    0 begin 1 begin 2 begin 3 begin 4 begin 5 begin 6 begin 7 begin 8 begin 9 begin 3 status code: OK 3 end 5 status code: OK 5 end 0 status code: OK 0 end 6 status code: OK 6 end 2 status code: OK 2 end 7 status code: OK 7 end 1 status code: OK 1 end 8 status code: OK 8 end 9 status code: OK 9 end 4 status code: OK 4 end
    UPD
    Не забываем диспозить респонс
    static async Task WR(int msg) { Console.WriteLine(msg + " begin");
    string url = "https://stackoverflow.com"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET";
    using (var response = (HttpWebResponse) await Task.Factory .FromAsync(request.BeginGetResponse, request.EndGetResponse, null)) //// <<<<< { Console.WriteLine(msg + " status code: " + response.StatusCode); Console.WriteLine(msg + " end"); } }

    Как в C объявить функцию с переменным числом аргументов?

    Функция printf может принимать разное количество аргументов. Например: printf("Hello!
    "); или printf("Hello, %s!
    ", "world"); Как это делается?


    Ответ

    Есть стандартный заголовок , который позволяют объявлять подобные функции. #include
    void _printf(char *format, ...) { va_list argp;
    va_start(argp, format);
    printf(format, argp);
    va_end(argp); }

    Кнопки изменения рейтинга на ajax

    Нужно реализовать ajax-запросы голосования "за" и "против" к комментариям, по аналогии как на Баше: т.е. при нажатии на кнопку не происходит перезагрузка страницы, а только меняется рейтинг. И как это событие обработать в джанговском представлении? Спасибо.


    Ответ

    В общем сделал так: навесил на кнопки функцию: function voite(id, action){ $.post("/quote/", {comment_id: id, comment_action: action}); } А на адрес '/quote/' навесил обработчик во вьюхе, обрабатывающий пост-запрос. Если нужно(интересно) - могу привести более детальный код. Дополнение. Скажу заранее, что обработчик лежит в отдельном приложении и обрабатывает страницу '/quote/', т.е. в urls.py есть такая строчка: (r'^quote/$', 'ajax.views.quote'), где 'ajax.views.quote' - путь к обработчику. Вот сам текст обработчика: def quote(request):
    message = "This is a technic page" if request.method == 'POST': if 'comment_id' in request.POST and 'comment_action' in request.POST: #обрабатываем запрос, повышаем/понижаем рейтинг и т.д.
    return HttpResponse(message) В обработчике проверяем метод, далее извлекаем из запроса (request) параметры и делай все что нам нужно.

    Как снизить уровень взаимодействия с сетью в WCF до Stream?

    Технология WCF хорошо решает проблему с брандмауэрами при разработке распределённых приложений, так как предоставляет уровень абстракции над стандартными протоколами и готовые механизмы аутентификации. Но нижний уровень упаковки данных в WCF - это контракты данных. Мало того, что wsdl накладывает много ограничений на формат данных, так ещё и эффективность xml-упаковки оставляет желать лучшего. Я сделал обёртку, чтобы надстроить бинарный формат данных поверх xml, но это тоже не самое эффективное решение. Да, объём передаваемых данных уменьшился примерно на порядок, исчезли падения на превышении немаленьких квот при получении списка объектов на видимом прямоугольнике карты, но зато и перепаковка выполняется дважды - сначала объектная модель сериализуется в бинарник, а потом бинарник размазывается в xml. Когда операций перепаковки много, это заметно. В идеале для сервисов внутреннего пользования (т.е., не предназначенных для интеграции с внешними системами) вместо контрактов я бы хотел иметь Stream, который отвечает за взаимодействие Endpoint'ов, разруливает поддержку стандартных сетевых протоколов и аутентификацию, но в который можно писать / читать любые данные. То есть, я хотел бы снизить уровень взаимодействия с сетью, но сохранив то хорошее, что есть в WCF. Поточные контракты данных здесь не подходят, так как если сервис инстанцирован локально, никаких перепаковок происходить не должно. Есть ли статьи на эту тему? Есть ли альтернативные технологии? Может, есть настройки WCF, которые бы позволяли сериализовывать данные не через xml, а прямо гонять сформированные бинарные массивы?


    Ответ

    В WCF можно собрать свой customBinding, включив туда альтернативный кодировщик сообщений. выглядит как то, что вам нужно.

    Добавить вершину в граф, для построения кратчайшего обхода всех вершин

    Есть неориентированный полный граф. Значения длины всех ребер заданы. Необходимо добавить вершину к графу или использовать уже существующую. Причем эта вершина должна иметь такое значение ребер, что бы начиная обход графа с нее, можно было обойти все вершины графа и длина пути обхода - минимальная.
    Прошу, помогите ответом. Мне подойдет как полностью раскрытый ответ, так и ссылка на источник с материалом по вышеописанной теме или даже небольшой намек: "в какую сторону копать"...


    Ответ

    Это задача о поиске кратчайшего гамильтонова пути. Так как граф полный, то очевидно не имеет смысла добавлять новую вершину - она только увеличит длину пути, также очевидно что такой путь всегда существует. Решение с помощью обхода в глубину будет давать неполиномиальную асимптотику. Посмотри в сторону переборов с отсечениями ...

    Разработка http-радио-проигрывателя Android

    Здравствуйте. Направьте пожалуйста на библиотеки, которые позволят: Получать поток с http Воспроизводить его непосредственно в программе И желательно, как сделать виджет Точно не знаю, название этого протокола, поэтому приведу дампы данных из сниффера: Запрос: GET /server.128 HTTP/1.0 Host: radio.server.fm User-Agent: WinampMPEG/5.61, Ultravox/2.1 Ultravox-transport-type: TCP Accept: */* Icy-MetaData:1 Connection: close Ответ: HTTP/1.0 200 OK Content-Type: audio/mpeg icy-br:128 icy-description:Server.FM icy-genre:Public Radio icy-name:Server icy-pub:1 icy-url:http://server.fm Server: Icecast 2.3.2 Cache-Control: no-cache icy-metaint:16000 Ну а дальше уже идут блоки данных по 1400-1460 байт. Т.е. обычный http, считывать все это не составит труда, но как это отдать проигрывателю и как достать всю интересующую информацию? Название трека и т.п. Подскажите описание всему этому делу?


    Ответ

    Может пригодиться: Radio-T Client Custom Audio Streaming with MediaPlayer

    Как создать и установить службу Windows при помощи WinApi на C/C++

    У меня есть задача создать службу Windows при помощи WinApi и ее установщик на C/C++. Это должен быть Win32-проект. Буду очень признателен, если кто-нибудь прольет свет в этом вопросе.


    Ответ

    Служебные приложения Windows Создание своего Windows Service Создание службы Windows с помощью программы sc.exe A Windows Service Application Google лучше всех проливает свет. )

    Работа с DLL, способы вызова функций

    У меня очень "новичковый" вопрос (никогда в жизни не работал с DLL) и состоит он в следующем: У меня есть 3 файла f1.c f2.c f3.c. В каждом из них вот по таким функциям: // f1.c int f1() { return 2; }
    // f2.c int f2() { return 4; }
    // f3.c int f3() { return 10; } потом я получил три отдельных объектных файла, с помощью команды (использую mingw по windows): gcc -c f1.c f2.c f3.c и далее я создаю DDL-ку, командой: gcc f1.o f2.o f3.o -o test1.dll -shared получился файл test1.dll С помощью DLL Export Viewer я открыл и посмотрел свой DLL файл: Как я теперь могу динамически или статически (вот это я еще плохо понял) обращаться к этой библиотеки, для вызова функций f1(), f2() ( а если бы в функции были бы параметры входные? ) например из своего C++ приложения? Что я вообще могу делать с этим файлом? Извиняюсь за немного глупый вопрос


    Ответ

    Случайно удалил свой ответ, что смог восстановил. Давно уже не работал, там все очень просто, разбираться не сложно, примерно так: если динамически, загружаете dll, получаете ссылку на функцию по имени (напр. "f1"), используете функцию по ссылке; если статически, подключаете библиотеку к проекту, объявляете внешнюю функцию и сразу можно вызывать в программе. В обоих случаях надо знать прототип функции. Более подробно см.: http://www.firststeps.ru/mfc/winapi/r.php?22 http://www.firststeps.ru/mfc/winapi/r.php?41 Надо еще разобраться с методами вызова функций: http://ru.wikipedia.org/wiki/Соглашение_вызова

    Вызов конструктора из класса

    В языке программирования Java конструктор класса из него самого можно вызывать с помощью конструкции: this(<список параметров>) Есть аналог в C#? Заранее спасибо! P.S.1: Зачем это нужно? Можно оч. удобно перепрыгивать между конструкторами избегая лишнего кода. В любой момент можно "обнулить" экземпляр вызвав конструктор по-умолчанию. P.S.2: Создавать отдельную функцию, выполняющую роль конструктора и вызывать ее(как это часто делают в С/С++) не предлагать.


    Ответ

    да, конечно есть: class Territory//Класс описывает логику игры { ... //Конструкторы класса public Territory(Point size) : this(size.X,size.Y) { }
    public Territory(int width, int hight) { _size = new Point(width, hight); Clear(); } ... } ещё можно добавить пустой конструктор: public Territory() : this(new Point())//или this(0,0) { }

    Плагин jquery. Создание нового метода для элемента.

    Народ, признаюсь честно: я ничегошеньки не понял в создании плагинов к jquery. мне стыдно, но надо исправляться. В теме кратность-значений-в-input я создал внутренности метода для изменения инпута. Подскажите, пожалуйста, как ЭТО превратить в
    $("SELECTOR").correct_value(quantity_per_pack);
    Чтобы работало с любым инпутом.


    Ответ

    Посмотрите ссылку, разберите пару плагинов. Если окажется мало, я попробую расписать подробнее. =) Добавлено

    eeeee

    eeeee

    eeeee


    Добавлено еще 1) Через $ работать тоже будет. Но для совместимости с другими библиотеками лучше использовать jQuery ($ - это псевдоним, его можно переопределить). 2) var opts = jQuery.extend(defObj, options); Из defObj jQuery сама перетягивает пары ключ:значение в options, если таких ключей нет в options. Доступ к свойствам opts осуществляется через opts.param или opts['param']. 3) options задается при вызове функции, а defObj пишется разработчиком. Все параметры являются необязательными, но если без каких-то из них ваш плагин не будет работать, их придется задать в defObj.

    Принцип многопоточности в Java

    Здравствуйте. Не могу разъяснить для себя принцип организации и работы потоков в Java. Постараюсь вкратце объяснить суть проблемы. Есть класс MyClass public MyClass { public void method1(int n) { int c = method2(n); // Ещё что-то } public int method2(int n) { // что-то делает } } Создаю единственный экземпляр этого класса под названием myObject. Создаю Runnable, в который передаю ссылку на мой объект и в run() выполняю следующие действия: public void run() { while (true) { myobject .method2(someInt); } } После чего запускаю несколько потоков с этим Runnable. Обратите внимание, что методы не синхронизированы, вообще ничего не синхронизировано. Первый поток заходит в метод1 и вычисляет С = С1, после чего вытесняется, после этого в метод1 заходит второй поток, считает С= С2 и вытесняется. После этого просыпается первый поток и продолжает выполнение метода1, чему будет равно значение C для продолжающегося потока #1?


    Ответ

    C1. Ведь C - локальная переменная. PS: разумеется, если method2 не имеет побочного эффекта, а то иначе сам процесс вычисления c будет подвергнут гонке. И кстати этот вопрос не по организации потоков в Java, а вообще многопоточности.

    Схожие css-свойства

    visibility: hidden; display: none; opacity: 0.0; В чем разница между этими css свойствами?


    Ответ

    visibility:hidden прячет еллемент, но он по прежнему может участвовать в расположении html елементов, т.е. он есть но его не видно. opacity:0.0 примерно тоже самое, только к тому-же свойство CSS3 т.е. не является кроссбраузерным. diplay:noneелемент не отображается и никак не влияет на отображение видимых елементов.

    Ajax запрос для HttpContext

    Создаётся ли новый экземпляр HttpContext.Current.Items при Ajax запросе (Ajax с использованием __doPostBack() из JavaScript)? Т.е. если в предыдущем ajax-запросе Items что-то содержало, то будет ли Items содержать это что-то при новом ajax-запросе?


    Ответ

    HttpContext.Items - коллекция, сохраняющаяся в пределах одного запроса (не важно: обычного, PostBack или Ajax). Между запросами элементы не сохраняются. Если нужно сохранить данные между запросами, воспользуйтесь HttpContext.Session

    Как извлечь дробную часть из числа на sql в oracle?

    Как извлечь дробную часть из числа на sql в oracle?


    Ответ

    Все просто: select mod(12.345, 1) from dual; выдаст 0.345

    Алгоритм оптимального раскроя линейных материалов

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


    Ответ

    Эта задача в англоязычной литературе носит название Cutting stock problem и является одной из разновидностей задачи о рюкзаке, когда рюкзаков несколько. Решать можно по-разному - динамическим программированием или приблизительными эвристиками. Эвристическое решение вам, судя по всему, не подходит (нужно точное решение), поэтому стоит смотреть в сторону динамики.

    Кроссбраузерная автоматическая печать изображения (решено)

    Задача: сделать на сайте так, чтобы графический файл автоматически отправлялся на принтер. Сама печать легко запускается через window.print(), но при этом распечатанный результат получается разного размера из разных браузеров: из IE печатается, как и задумано, на весь лист А4, из Firefox картинка занимает меньше четверти листа, из Opera и Chrome — нечто среднее. Пробовал устанавливать размер картинки через CSS, указывая в качестве единицы измерения дюймы (in) — не помогает. Как сделать, чтобы рисунок печатался на полный лист из любого браузера? UPD: Решил проблему, установив для рисунка width:100% через css media=print


    Ответ

    Браузеры практически не дают управлять параметрами печати. Для Опреы и Хрома можно указать отступы в CSS: @media print{ @page: {margin: 0%} } Остальные браузеры это игнорируют, подставляют значения, указываемые пользователем (или по дефолту). То же касается колонтитулов - полностью пользовательская настройка. А так печать картинки при выставленных одинаковых параметрах отступов, колонтитулов и галки "по ширине страницы" печатается одинаково. Устанавливайте картинке width:100% в правилах для @media print, дальнейшее будет зависеть от пользователя.

    Разрешение зависимостей для орграфа с циклами

    Балуюсь, хочу сделать транслятор из BNF в код-грамматику для LEPL. Парсер написал, код для отдельных правил генерируется, но дальше подзастрял с порядком правил.
    Есть набор правил, ссылающихся друг на друга. Зависимости можно просто представить в виде орграфа, в котором есть циклы:

    Нужно разрешить зависимости относительно заданной вершины, получив список, в котором следует записывать правила так, чтобы последующие правила уже «видели» все требуемые им предыдущие. Если возникает цикл — нужно перед первым употреблением поместить «предварительную декларацию.» Т.е., для примера графа выше, если, упрощая, считать, что вершины содержат просто строки, получить что-то в духе:
    >>> deps_dict = { ... "A": {"B", "C"}, ... "B": {"D", "E"}, ... "C": {"A", "E"}, ... "E": {"E", "D"} ... } >>> resolve_deps(deps_dict, "A") [ "D" # {} Predeclare("E"), # ref'd by {E, B} "E" # {D, E} "B" # {D, E} Predeclare("A"), # ref'd by {C} "C" # {A, E} "A" # {B, C} ]
    (То, что это не единственный вариант удовлетворяющего условиям результата — понятно.)
    Положение в списке предварительных деклараций не очень важно — в худшем случае, можно их вытащить наверх, хотя лично мне хочется размещать их не раньше самого необходимого (т.е. перед первой отсылкой).
    Если бы циклов не было — все было бы, вроде как, понятно — про топологическую сортировку я нашел и почитал. Но как справиться с циклами — честно говоря, пока не соображу.


    Ответ

    Поскольку БНФ оперирует контекстно-свободными грамматиками, то самое простое - это использовать соответствующий раздел теории синтаксического анализа. Самое неприятное, что может быть в произвольно взятой КС-грамматике G - это левая рекурсия, которая, нестрого говоря, делает грамматику G недетерминированной.
    При этом шаги алгоритма избавления от левой рекурсии включают в себя избавление от циклов. Поскольку вы, судя по всему, пытаетесь достичь детерминированности соответствующей грамматики, то лично я рекомендовал бы сразу же заимплементировать алгоритм избавления от левой рекурсии.
    Простое описание подхода избавления от левой рекурсии можно найти здесь, более же обзорная публикация по разным алгоритмам избавления от левой рекурсии расположена тут.
    Если вы действительно знаете, что делаете и хотите только избавиться от циклов, то воспользуйтесь только шагами (1) и (2) из публикации Eliminating left-recursion: three steps
    Из дополнительных референсов могу порекомендовать пост Эрика Липперта по поводу CFG и циклов в них вообще, а также набор хороших презентаций по теории формальных языков.

    Двоичный циклический сдвиг

    Здравствуйте, друзья. Подскажите, пожалуйста, оптимальный способ реализации двоичного циклического сдвига (вращения) 32-разрядного значения влево на 11 разрядов на языке МК-61.


    Ответ

    Встроенные битовые операции тут не помогут, т.к. нет даже нециклического сдвига. Поэтому делаем в десятичной системе: в одном из регистров старшие 16 бит, в другом - младшие. Из старших 16 бит отделяем левые 11 бит (делением нацело на 2 в 5 степени), запоминаем. Остальные 5 бит тоже отделяем (для этого надо как-то остаток от прошлого деления получить), умножаем на 2 в 11 степени. Из младших 16 бит точно так же выделяем старшие 11 бит, прибавляем их к старшему байту. Остаток опять же умножаем на 2 в 11 степени, прибавляем те 11 бит, которые сохранили в самом начале.

    Отношение к работе программистом [закрыт]

    Добрый вечер! В последнее время меня всё сильнее стал интересовать следующий вопрос: почему для людей возрастной категории (от 50 и выше) перспектива работы программистом не расценивается, как серьёзная профессия? То есть, если им сказать: "Я хочу работать программистом" или "Мне нравится заниматься программированием и зарабатывать этим на жизнь" - для людей вышеуказанной возрастной эти фразы практически эквивалентны какому-то лентяйству... Мне не совсем ясна эта реакция. Интересно, почему по-вашему работа даже младшим специалистом технической поддержки, меняя картриджы и устанавливая оргтехнику, кажется людям в возрасте намного перспективнее, нежели чем работа программистом (в любой сфере, кроме, скорее всего, 1С-разработчика)? P.S. @avp, так как вопрос уже закрыт модератором, я не могу ответить на Ваш вопрос. конечно это были люди не из IT-сферы. Опрос вызвал неоднозначную реакцию, что, скорее всего, вызвано тем, что именно я изложил суть вопроса не так. вообще тема интересная для обсуждения, но не совсем удачно мной сформулированная.


    Ответ

    Скорее всего тот контингент, о котором Вы говорите, вырос в "Советах". И скорее всего они привыкли работать руками,именно делать что-то "физически". А сейчас настает такое время, когда работать мозгами гораздо выгоднее и легче. Но большинство людей "непробиваемые", им тяжело объяснить,что ты просидел весь день за компьютером и написал 20 строк за весь день. Но для тебя эти 20 строк- золото, ты искал,отлаживал,чистил,оптимизировал, а для них- тык-тык-тык.