Страницы

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

Показаны сообщения с ярлыком яндекс. Показать все сообщения
Показаны сообщения с ярлыком яндекс. Показать все сообщения

вторник, 31 марта 2020 г.

Не правильно строится маршрут яндекс карта (api)

#javascript #yandex_maps_api #яндекс #map #яндекс_карты


Я строю маршрут с использованием путевых и транзитных точек. Но яндекс карта не правильно
строит маршрут. Она соединяется там где не должна.

Вот ссылка на codepen и код:



function init () {

  var multiRoute = [];

  function createMultiRoute(routeData, viaData, color) {
    multiRoute.push( new ymaps.multiRouter.MultiRoute({
        referencePoints: routeData,
        params: viaData
      }, {
        editorDrawOver: false,
        wayPointDraggable: true,
        viaPointDraggable: true,
        routeStrokeColor: "000088",
        routeActiveStrokeColor: color,
        pinIconFillColor: color,
        boundsAutoApply: true,
        zoomMargin: 30
    }));
  }

  // Создаем карту с добавленными на нее кнопками.
  var myMap = new ymaps.Map('map', {
    center: [55.750625, 37.626],
    zoom: 14
  });

  createMultiRoute([
        [60.014919, 30.649850],
        [60.014958, 30.648536],
        [60.017671, 30.646447],
        [60.019146, 30.645540],
        [60.024197, 30.645711],
        [60.025782, 30.644554],
        [60.028975, 30.640299],
        [60.027754, 30.630244],
        [60.024331, 30.631359],
        [60.023627, 30.637576],
        [60.023723, 30.638850],
        [60.024200, 30.645713]
      ], {
      viaIndexes: [1,2,3,4,5,6,7,8,9,10]
      }, "ff0000");

    myMap.geoObjects.add(multiRoute[0]);

}

ymaps.ready(init);
#map {
  width: 600px;
  height: 400px;
  background: #000;
}

Как сделать так, чтобы не было подобных соединений?


Ответы

Ответ 1



Может у вас там по Плоткина одностороннее движение? Точнее, на неё нет поворота с перекрёстка. Маршрут построен правильно, чтобы пройти по точкам, приходится делать круг.. Более простой маршрут Знак на gmaps

воскресенье, 8 марта 2020 г.

Размер кнопок в блоке Яндекс.Поделиться

#javascript #css #яндекс #share #ya_share2


Как увеличить размер кнопок "Поделиться", используя сервис Яндекс/Поделиться?
    


Ответы

Ответ 1



UPD. Спасибо EatMyDust за комментарий к ответу. Исследовал вопрос подробнее. Яндекс предлагает 4 внешних вида для блока «Поделиться». Четвёртый из них — с кнопками маленького размера, поэтому увеличивать интересно только первые три. Предлагаю вариант стилей для кнопок со стороной 32 пикселя вместо 24. Базовые значения — в комментариях к каждой строке. ya-share2__container_size_m .ya-share2__icon нужно переопределить для всех видов блока. Для блока со счётчиками нужно добавить .ya-share2__container_size_m .ya-share2__counter. А для блока с меню — .ya-share2__container_size_m .ya-share2__icon_more:before и .ya-share2__container_size_m .ya-share2__popup_direction_bottom. /* 1 */ .ya-share2__container_size_m .ya-share2__icon { height: 32px !important; /* 24px */ width: 32px !important; /* 24px */ background-size: 32px 32px !important; /* 24px 24px */ } /* 2 */ .ya-share2__container_size_m .ya-share2__counter { font-size: 14px !important; /* 12px */ padding: 8px 10px 0 10px !important; /* 5px 8px 0 8px */ } /* 3 */ .ya-share2__container_size_m .ya-share2__icon_more:before { line-height: 22px !important; /* 13px */ } .ya-share2__container_size_m .ya-share2__popup_direction_bottom { top: 36px !important; /* 28px */ }

только иконки

счётчики

иконки и меню



Ответ 2



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

Ответ 3



Нет никакой гарантии, что переопределение стилей, предлагаемое @Gleb Kemarsky, не сломается при ближайшем обновлении блока. Более безопасным вариантом мне видится подход с использованием свойства transform. Такой подход не зависит от внутреннего представления блока и, следовательно, менее чувствителен к обновлениям. .ya-share2__list { transform: translate(25%, 25%) scale(1.5); }
Для старых IE можно использовать в качестве фоллбэка свойство zoom.

Как изменить иконки в блоке поделиться от Яндекс

#html #css #яндекс


Каким образом изменить/заменить иконки в блоке поделиться от Яндекс.
В API об этом не сказано.
    


Ответы

Ответ 1



Например заменить фон либо общий, либо для каждой иконки: new Ya.share({ element: 'share', elementStyle: { 'type': 'none', 'quickServices': ['vkontakte', 'facebook', 'twitter'] }, link: document.location.href, title: document.title }); #share .b-share-icon_vkontakte, #share .b-share-icon_facebook, #share .b-share-icon_twitter { width: 2rem; height: 2rem; display: inline-block; vertical-align: middle; background: transparent; } #share .b-share-icon_vkontakte { background: url(http://iconmonstr.com/wp-content/assets/preview/2013/96/iconmonstr-vk-1.png) center no-repeat; -webkit-background-size: cover; background-size: cover; } #share .b-share-icon_facebook { background: url(http://iconmonstr.com/wp-content/assets/preview/2012/96/iconmonstr-facebook-1.png) center no-repeat; -webkit-background-size: cover; background-size: cover; } #share .b-share-icon_twitter { background: url(http://iconmonstr.com/wp-content/assets/preview/2012/96/iconmonstr-twitter-1.png) center no-repeat; -webkit-background-size: cover; background-size: cover; }
Еще вариант с :before на примере иконок font-awesome: new Ya.share({ element: 'share', elementStyle: { 'type': 'none', 'quickServices': ['vkontakte', 'facebook', 'twitter'] }, link: document.location.href, title: document.title }); #share { background: transparent; } #share [class*="b-share-icon_"] { width: 2rem; height: 2rem; display: inline-block; vertical-align: middle; background: transparent; position: relative; text-align: center; } #share [class*="b-share-icon_"]:before { display: inline-block; font: normal normal normal 2rem/2rem FontAwesome; color: #333; } #share .b-share-icon_vkontakte:before { content: '\f189'; } #share .b-share-icon_facebook:before { content: "\f09a"; } #share .b-share-icon_twitter:before { content: "\f099"; } #share [class*="b-share-icon_"]:hover:before { color: tomato; }


воскресенье, 2 февраля 2020 г.

Как вывести точки на яндекс карте на основании json файла?

#javascript #яндекс #yandex_maps_api


День добрый!
Например, вот json файл data.json

{
"Points":[{
    "MapPoinName": "Город 1",
    "MapPointPopulation": 125000,
    "MapPointCoordinates": "58.211748, 59.979321"
}, {
    "MapPoinName": "Город 2",
    "MapPointPopulation": 105000,
    "MapPointCoordinates": "51.221748, 53.929321"
}]


}

Вывожу так:



    


    Карта возможностей и проблем
    
	
    	





Данные из json получаю, но код внутри for (var i = 0; i < data.Points.length; i++) не выполняется


Ответы

Ответ 1



Вот пример JavaScript кода для вывода точек с кластеризацией: ymaps.ready(init); function init() { var map = new ymaps.Map("map", { center: [55.76, 37.57], zoom: 5, controls: ['zoomControl', 'searchControl'] }); $.getJSON('data.json', function(data) { // Создадим объект точек из data.Points var myGeoObjects = data.Points.map(item => { return new ymaps.GeoObject({ geometry: { type: "Point", // Переведем строку с координатами в массив coordinates: item.MapPointCoordinates.split(', ') }, properties: { clusterCaption: 'Описание в кластере', balloonContentBody: [ '
', '

Данные

', 'Данные: МО "Название МО"
', 'Данные: ФИО Главы МО
', '
' ].join('') } }, { preset: "islands#darkGreenDotIcon", }); }) // Создадим кластеризатор после получения и добавления точек var clusterer = new ymaps.Clusterer({ preset: 'islands#invertedDarkGreenClusterIcons', clusterDisableClickZoom: true, clusterBalloonContentLayoutWidth: 800, clusterBalloonLeftColumnWidth: 160 }); clusterer.add(myGeoObjects); map.geoObjects.add(clusterer); map.setBounds(clusterer.getBounds(), { checkZoomRange: true }); }) }

Ответ 2



Yandex api Maps имеет вот такую хорошую функцию addOverlay при помощи которой можно добавить точки на карте. Сделал стандартную инициализацию yandex api maps первой точкой сделал текущую геопозицию пользователя, Потом после парсинга json данных циклом проходим по нему и добовляем наши метки на карте, после добавления всех меток рисуем карту с заданными данными. var points_json = '{"Points":[{"MapPoinName": "Город 1","MapPointPopulation": 125000,"MapPointCoordinates": "58.211748, 59.979321"}, {"MapPoinName": "Город 2","MapPointPopulation": 105000,"MapPointCoordinates": "51.221748, 53.929321"}]}'; var points = $.parseJSON(points_json); // Создание обработчика для события window.onLoad YMaps.jQuery(function () { // Создание экземпляра карты и его привязка к созданному контейнеру var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]), // Центр карты center, // Масштаб zoom = 10; // Получение информации о местоположении пользователя if (YMaps.location) { center = new YMaps.GeoPoint(YMaps.location.longitude, YMaps.location.latitude); if (YMaps.location.zoom) { zoom = 3; } map.openBalloon(center, "Место вашего предположительного местоположения:
" + (YMaps.location.country || "") + (YMaps.location.region ? ", " + YMaps.location.region : "") + (YMaps.location.city ? ", " + YMaps.location.city : "") ) }else { center = new YMaps.GeoPoint(37.64, 55.76); } for(var i=0;i < points.Points.length;i++){ var tmp_points = points.Points[i]['MapPointCoordinates'].split(', '); var placemark = new YMaps.Placemark(new YMaps.GeoPoint(tmp_points[0],tmp_points[1])); placemark.description = "point "+i+" description"; map.addOverlay(placemark); center = new YMaps.GeoPoint(tmp_points[0], tmp_points[1]); } // Рисуем карту map.setCenter(center, zoom); });
Более подробно об этом можете прочитать здесь.

четверг, 23 января 2020 г.

Откуда поисковые системы узнают о новых сайтах?

#google #seo #яндекс #поисковые_системы


Кто-нибудь знает откуда поисковые системы узнают о новых сайтах (доменах)? Если,
к примеру, никто не сообщал о сайте в панели вебмастера поисковой системы и не ссылался
на этот сайт. Хотя он через какое-то время появляется в индексе.
    


Ответы

Ответ 1



Данные из браузеров. Когда разработчик делает свой сайт, он часто на него заходит. Браузер все это собирает. Google Chrome - Google. Internet Explorer, Edge - bing. Yandex.Browser - Yandex. Некоторые поисковики пользуются базами Google и Yandex. Регистраторы доменов. У них на сайте есть ссылки. Потом еще возможно когда человек регистрирует домен, ему на почту регистратор отправляет письмо со счетом о покупке. Компании проверяют эти письма, спам или не спам. И т.д. А в письмах есть ссылки, робот на них переходит и проверяет. Потом еще у меня такое было, что кидаю ссылку в вк кому то из друзей и вижу что робот ООО "Вконтакте" заходил на сайт. Не исключено что так и с письмами на почту.

Ответ 2



Существует ф-ция на многих админках - не выдывать в поиске. Тоесть, сайт НЕ будет ни при каких условиях появлятся. Если на сайте не стоит эта ф-ция, то при входе на сайт с ЛЮБОГО браузера, данные сразу отправятся в Сеть. Так что, это может быть разраб, ссылки, реклама, знакомые и т.д.

суббота, 11 января 2020 г.

Как изменить цвет вкладки в Яндекс.Браузере?

#html #css #вёрстка #яндекс #toolbar


Как изменить цвет вкладки в Яндекс.Браузере с того, который формируется по иконке
сайта на произвольный?

На официальном сайте Яндекса есть только информация о виджетах, выводимых в закладках:
https://tech.yandex.ru/browser/tableau/doc/dg/concepts/create-widget-docpage/

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

Сам код манифеста виджета:

{
    "api_version": 4,
    "layout":
    {
        "logo": "/favicon.png",
        "color": "#fff"
    }
}


Еще нашел такой код:




Но толку от него нет, он ничего не меняет.
    


Ответы

Ответ 1



Официальный ответ от службы техподдержки Яндекса: Цвет активной вкладки определяется автоматически его виджетом. Если у сайта есть свой логотип для виджета на странице Табло, то оформление вкладки будет ему соответствовать. Как сделать виджет, Вы можете прочитать здесь: https://tech.yandex.ru/browser/tableau/doc/dg/concepts/create-widget-docpage/ Если виджета у сайта нет, в этом случае цвет вкладки будет взят из фавиконки сайта. P.S. От себя добавлю, что в ходе экспериментов выяснилось, что цвет фона в большинстве случаев берется из первого заполненного верхнего правого пикселя иконки и делается на несколько тонов темнее. В ряде случаев цвет формируется по другим алгоритмам (в частности, для очень светлых или очень темных иконок, а также для изображений с сочетанием разных цветов). К сожалению, на практике Яндекс.Браузер работает с виджетом не совсем корректно, новые открываемые страницы красятся по цвету иконки сайта, а при манипуляциях с history браузера (ajax и т.д.) цвет берется из параметра "color" (цвет логотипа виджета не влияет на окрашивание). Будем надеяться, что в новых версиях браузера все будет работать правильно.

вторник, 7 января 2020 г.

Задача о размере карт, Яндекс.Алгоритм.2015

#алгоритм #яндекс


Если кто не знает, на днях состоялся квалификационный раунд Яндекс.Алгоритм.2015.
Формат раунда такой, что дается 100 минут и 7 задач, которые необходимо решить. Собственно,
не сказать, что задачи сложные, но тем не менее трудности возникли.
Вообще интересно было бы устроить обсуждение вместе с участниками соревнования по
поводу решения задач. В данной теме обсуждается задача о "Размере карты".
Впрочем, любой желающий, может поучаствовать в решение данной задачи.

Условие:
Алексей — обычный пользователь интернета. Однажды, пользуясь сервисом Яндекс.Карты,
Алексей задумался: ведь наверняка итоговое изображение на экране формируется из нескольких
прямоугольных изображений меньшего размера, получаемых с сервера. Алексею стало интересно:
сколько существует возможных размеров изображений таких, что из них можно составить
картинку, видимую на экране.
Видимая область карты занимает N × M пикселей на экране Алексея. Его интересует количество
пар (A, B) (1 ≤ A ≤ N, 1 ≤ B ≤ M) таких, что прямоугольниками A × B можно выложить
прямоугольник N × M, размещая их вплотную друг с другом, без накладываний и поворотов.
При этом Алексей уверен, что посылать большие картинки с сервера очень накладно, и
поэтому его не интересуют пары (A, B), для которых A ⋅ B > R. Также Алексей понимает,
что посылать большое количество маленьких картинок тоже невыгодно, поэтому его не интересуют
пары (A, B), для которых A ⋅ B < L.
Помогите Алексею ответить на интересующий его вопрос.

Формат ввода:
Единственная строка входного файла содержит четыре целых числа N, M, L, R (1 ≤ N,
M ≤ 10^9, 1 ≤ L ≤ R ≤ N ⋅ M), разделённых пробелами.

Формат вывода:
Выведите единственное число: количество возможных пар, удовлетворяющих требованиям
Алексея.

Пример 1
Ввод
4 4 1 7
Вывод
6

Пример 2
Ввод
1 30 10 17
Вывод
2

Пример 3
Ввод
5 5 10 20
Вывод
0

Примечания:
В первом тесте возможными вариантами являются 1× 1, 1× 2, 2× 1, 2× 2, 1× 4 и 4× 1. 
В во втором тесте возможными вариантами являются 1× 10 и 1× 15.
В третьем тесте произошла магия, и Алексей увидел изображение, которое никак не могло
быть составлено, если его предположения верны.

Ограничение времени:  1 секунда 

Ограничение памяти:   64Mb 

Ввод: стандартный ввод или input.txt 

Вывод:    стандартный вывод или output.txt 

Ниже мой вариант решения задачи на java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Task5
{
public static void main(String[] args) throws IOException
{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String[] line = br.readLine().split(" ");

    int N = Integer.valueOf(line[0]);
    int M = Integer.valueOf(line[1]);
    int L = Integer.valueOf(line[2]);
    int R = Integer.valueOf(line[3]);

    int  count = 0;
    for (int  ab = L; ab <= R; ab++)
    {
        //long nm = N * M;
        if ((N * M) % ab == 0)
        {
            for (int  a = 1; a <= N; a++)
            {
                if ((ab % a == 0) && ( ab / a <= M) && (M % (ab / a) == 0) && (N
% a == 0))
                {
                    //System.out.println(a + " x " + ab / a);
                    count++;
                }
            }
        }
    }

    System.out.println(count);

    }

}


Заваливается он на 15 тесте, с ошибкой RE ("Ошибка во время исполнения"), подумал
я, что ошибка в размерности int, но нет, по заданию числа не превышают 10^9.
Но все же, попробовав long вместо int, 14 тест завалился с сообщением TL ("Лимит
времени исполнения"). Тогда я попробовал реализовать задачу на c++, но так и не преодолел
15 тест.

Надеюсь, что это тема не останется не замеченной.

#UPD1
Нашел еще более эффективное решение по времени:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;


public class Task5_2
{

    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] line = br.readLine().split(" ");

        long N = Integer.valueOf(line[0]);
        long M = Integer.valueOf(line[1]);
        long L = Integer.valueOf(line[2]);
        long R = Integer.valueOf(line[3]);

        ArrayList nMod = new ArrayList();
        ArrayList mMod = new ArrayList();

        for (long n = 1; n <= N / 2; n++)
            if (N % n == 0)
                nMod.add(n);
        nMod.add(N);

        for (long m = 1; m <= M / 2; m++)
            if (M % m == 0)
                mMod.add(m);
        mMod.add(M);

        int count = 0;
        for(long n : nMod)
            for (long m : mMod)
                if ((n * m >= L) && (n * m <= R))
                    count++;

        System.out.println(count);

    }

}


Хотя этот вариант не решил проблему прохождения 15-го теста. По прежнему RE.

#UPD2 Собственно программа, которая проходит все 54 теста.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;


public class Task5_5_1
{

    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] line = br.readLine().split(" ");

        long N = Long.valueOf(line[0]);
        long M = Long.valueOf(line[1]);
        long L = Long.valueOf(line[2]);
        long R = Long.valueOf(line[3]);


        boolean isPrimeN = isPrime(N);
        boolean isPrimeM = isPrime(M);

        ArrayList divsN = new ArrayList();
        ArrayList divsM = new ArrayList();
        long count = 0;

        if (isPrimeN)
        {
            divsN.add(1L);
            if (N != 1) divsN.add(N);
        }
        else
        {
            ArrayList primeFactorsN = getPrimeFactors(N);
            divsN = getDivs(primeFactorsN);
        }

        if (isPrimeM)
        {
            divsM.add(1L);
            if (M != 1) divsM.add(M);
        }
        else
        {
            ArrayList primeFactorsM = getPrimeFactors(M);
            divsM = getDivs(primeFactorsM);
        }

        for (long divN : divsN)
            for (long divM : divsM)
            {
                long divNM = divN * divM;
                if (divNM >= L && divNM <= R)
                {
                    //System.out.println(divN + " x " + divM);
                    count++;
                }
            }

        System.out.println(count);

    }

    public static boolean isPrime(long num)
    {
        long sqrtNum = (long) Math.sqrt(num);
        for (long i = 2; i <= sqrtNum; i++)
        {
            if (sqrtNum % i == 0)
                return false;
        }

        return true;
    }

    public static ArrayList getPrimeFactors(long num)
    {   
        ArrayList primeFactors = new ArrayList();

        for (long i = 2; i <= num / i; i++)
        {
            while(num % i == 0)
            {
                primeFactors.add(i);
                num /= i;
            }
        }
        if (num > 1)
            primeFactors.add(num);

        return primeFactors;
    }

    public static ArrayList getDivs(ArrayList primeFactors)
    {
        ArrayList divs = new ArrayList();
        long n = primeFactors.size();
        long rank = (long) Math.pow(2, n);

        for (long i = 0; i < rank; i++)
        {
            String bin = Long.toBinaryString(i);
            while (bin.length() != n)
                bin = '0' + bin;

            long num = 1;
            for (int j = 0; j < bin.length(); j++)
            {
                if (bin.charAt(j) == '1')
                    num *= primeFactors.get(j);
            }

            if (!divs.contains(num))
                divs.add(num);
        }

        return divs;
    }
}


P.S. Я немного подстраховался, заведя все переменный и контейнеры типом long, хотя
по сути, можно было бы для переменный M и N выбрать тип int, но в таком случае постоянно
заваливался 15 тест, хз почему (плохо, что не предоставляется содержимое заваленных
тестов).

#UPD3 Кстати, задачу о ранжирование документов можно посмотреть тут.
    


Ответы

Ответ 1



Вот эта прога прошла все тесты, максимальное время 3 мс (тест #40) Program E; Type TPrime = record P: Cardinal; A, B: Integer; end; Var N, M, D: Cardinal; LL, RR: Int64; Primes: array[0..10000]of TPrime; PrimesCtr, Res: Integer; Procedure TestD; begin if (N mod D = 0) or (M mod D = 0) then with Primes[PrimesCtr] do begin P := D; A := 0; B := 0; while N mod D = 0 do begin N := N div D; inc(A); end; while M mod D = 0 do begin M := M div D; inc(B); end; inc(PrimesCtr); end; inc(D, 1 + D mod 2); end; Function Min2(x,y: Integer): Integer; begin if x < y then Result := x else Result := y; end; Function Min4(x,y,z,t: Integer): Integer; begin Result := Min2(Min2(x,y), Min2(z,t)); end; Procedure Recurs(Index: Integer; Prod: Int64; R: Integer); var L: Integer; begin if Index > 0 then begin dec(Index); with Primes[Index] do begin for L := 0 to A + B do begin if L > 0 then Prod := Prod * P; if Prod <= RR then Recurs(Index, Prod, R * (1 + Min4(L, A, B, A+B-L))); end; end; end else if Prod >= LL then inc(Res, R); end; Begin Readln(N, M, LL, RR); D := 2; PrimesCtr := 0; repeat TestD until (D*D > N) and (D*D > M); D := N; if D > 1 then TestD; D := M; if D > 1 then TestD; Res := 0; Recurs(PrimesCtr, 1, 1); Writeln(Res); End.

Ответ 2



Для решения задачи необходимо так или иначе найти все делители чисел(факторизовать) N и M. Это автоматически означает экспоненциальную сложность алгоритма. Чтобы её решить быстро(за полиномиальное время или меньше) Вам необходимо либо воспользоваться 64 мегабайтной таблицей простых делителей либо раздобыть квантовый компьютер и запустить на нем алгоритм Шора. Других вариантов я не знаю и всякие выкрутасы с заменой языков программирования или переиначиванием потока управления и типов данных в наивном экспоненциальном алгоритме перебора делителей, который вы по сути предлагаете Вам никак не помогут. Скорее всего это просто шутка Яндекса.(Или может они просто все еще надеются, что какой-нибудь математик мирового уровня ВНЕЗАПНО прибежит к ним на конкурс с доказательством P=NP) Также на всякий случай прилагаю список хороших субэкспоненциальных алгоритмов факторизации, позаимствованный мной с большого SO: Число порядка 2^16: Таблица делителей. Число порядка 2^70: Модификация Ричарда Брента Ρ-алгоритма Полларда. Число порядка 10^50: Эллиптическими кривыми. Число порядка 10^100: Метод квадратичного решета. Число порядка и больше 10^100: Общий метод решета числового поля. Также рекомендую ознакомиться с хитроумной математической проблемой P=NP

Ответ 3



1 ≤ N, ≤ 10^9, 1 ≤ L ≤ R ≤ N ⋅ M На M ограничение не дано. Но я предполагаю, что тоже 10^9. Тогда L и R до 10^18. Но даже если я не заметил, и где-то оговаривается, что все числа до 10^9, то if ((N * M) % ab == 0) их произведение всё равно до 10^18.

Ответ 4



Факты: Найти все делители числа T можно за время O(sqrt(T)). link Для любого натурального числа T <= 10^9 количество делителей не превосходит 1500. Можете проверить... Решение: Находим делители a1,a2...an числа N. Находим делители b1,b2...bn числа M. Перебираем все возможные пары ai*bj и проверяем, что они удовлитворяют заданным условиям. Итоговая сложность O(sqrt(N*M))

четверг, 2 января 2020 г.

Стоит ли использовать БЭМ [закрыт]

#яндекс #бэм


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Update the question so it's
on-topic for Stack Overflow на русском.
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Добрый день!
Стоит ли использовать БЭМ (Блок Элемент Модификатор (Яндекс)) и, что означает независимый
блок в контексте БЭМ?    


Ответы

Ответ 1



БЭМ, это соглашение о наименованиях. Не MVC, и не исключает совместное использование с каким-нибудь MVC. БЭМ помогает решить ряд определенных проблем: Исключить зависимые имена классов. При разработке долгоиграющих проектов или при большой команде это приводит к разъезжающимся страницам Существенно уменьшить усилия на изучение проекта для нового разработчика. Все части вёрстки разложены по файлам и папкам с интуитивно понятными именами Избавиться от копипаста в рамках страницы/сайта/портала. Блок это готовая часть вёрстки, его можно и нужно повторно использовать. Элементы и модификаторы позволяют точечно вносить изменения для каждого случая использования этого блока, избегая взаимное влияние использования модифицированных блоков на одной странице Избавиться от копипаста, если необходимо внести изменение в определенный компонент вёрстки. Не нужно делать правки в 100500 местах, правки вносятся в одном месте Ценой этого является высокий порог входа к использованию БЭМ. Это принять БЭМ в сердце, разобраться с инструментами сборки, применимыми к вашему случаю, донести БЭМ до окружающих коллег. Стоит ли заплатить эту цену, решать вам. Про АНБ в контексте БЭМ хорошо сказано здесь https://ru.bem.info/forum/issues/-46/ По сути это два правила: Всем элементам внутри блока надо задать классы, т.е. не опираться в CSS на имена элементов Все классы, на которые накладываются стили этого блока, должны быть уникальными, например, начинаться с имени класса корневого элемента

Ответ 2



Я бы очень рекомендовал БЭМ как методологию, не обязательно использовать все инструменты БЭМ как подход к разработке. Для примера: на проектах, где использовали БЭМ в коде чистота и порядок, блоки независимы, гибки (имхо модификаторы - это прекрасно) и что самое важное - они остаются блоками во всех смыслах))

Ruby. Взаимодействие с yandex kassa [закрыт]

#ruby_on_rails #ruby #криптография #яндекс #openssl


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Update the question so it's
on-topic for Stack Overflow на русском.
                        
                        Закрыт 3 года назад.
                                                                                
           
                
        
Не знаю, насколько по теме задавать такие вопросы на подобном ресурсе, но я уже отчаялся.

Никак не получается сформировать верный запрос к серверу яндекс денег (3-й шаг) https://tech.yandex.ru/money/doc/payment-solution/payout/format-docpage/ 

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

Может быть кто-то уже работал с этой системой и может поделиться примером кода?
    


Ответы

Ответ 1



На всякий случай пишу здесь решение. Проблема не в коде, проблема не в программистах. Проблема в менеджерах Яндекса. Запомните, помимо того, что менеджер ОБЯЗАН выдать вам два сертификата, один для шифрования ваших запросов, один для расшифровки ответов Яндекса, обязательно убедись что для расшифровки на стадии тестирования они выдали вам сертификат для ТЕСТОВОГО сервера, а не продакшен варианта. Если они этого не сделали, пинайте их(звонками, именно звонками, email сообщения для этого не годятся) до тех пор пока они всё вам не передадут, продолжайте пинать, даже если они пытаются говорить, что всё необходимо вам передали.

Ответ 2



Посмотрите материал по ссылке, быть может это поможет (если еще актуально) - https://gist.github.com/kryzhovnik/5b73c1c0637e47b01eaa

вторник, 24 декабря 2019 г.

Yii2 и Яндекс Касса

#php #yii2 #яндекс


Три часа борюсь с яндекс кассой. Саппорт говорит  что у меня сайт не принимает POST
запросы и возвращает bad request #400. Сайт на Yii2. Есть предположение что это из
за ckrf токена. Может быть кто то сталкивался и сможет мне помочь?
    


Ответы

Ответ 1



В контроллере реализуйте метод beforeAction таким образом. public function beforeAction($action) { $this->enableCsrfValidation = false; return parent::beforeAction($action); } Если не хотите отключать CSRF для всех действий, то можете отключить для определенных действий: public function beforeAction($action) { if ($action->id === 'test') $this->enableCsrfValidation = false; return parent::beforeAction($action); } В данном случае мы отключили CSRF для действия test

Ответ 2



Для нескольких экшенов: public function beforeAction($action) { $this->enableCsrfValidation = !in_array($action->id, ['check', 'aviso']); return parent::beforeAction($action); }

пятница, 20 декабря 2019 г.

Получить адрес по координатам в Yandex maps

#яндекс #yandex_maps_api


Подскажите, пожалуйста, как можно по гео координатам получить адрес?

Т.е. есть координаты 30.524933, 50.447218 и нужно определить адрес или объект в данном
случае - Украина, Киев, метро Крещатик. В гугле искал, все ищут наоборот.
    


Ответы

Ответ 1



В яндекс картах есть как прямой так и обратный геокодер. Прямой - это когда по адресу определяем координаты. Обратный, соответственно, обратно. Вот ссылка на документацию: geocode. Вот тут есть пример использования геокодера как прямого так и обатного Примеры использования JavaScript API. Еще примеры: Помещение в balloonContentBody адреса. Используя обратное геокодирование, вывести полный адрес.

Ответ 2





Настройка smtp Yandex в Rails

#ruby_on_rails #яндекс #smtp


Добрый день

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

Второй (следуя руководству по ActionMailer) - не такой компактный и сообщения не
отправляются.

Хочу разобраться с обоими

Вариант 1

#app/controllers/feedback_info_controller.rb

def send_mail
 smtp = Net::SMTP.new( "smtp.yandex.ru", 587 )
 smtp.enable_starttls
 smtp.start( "yandex.ru", "my_adr@yandex.ru", "пароль", :plain ) do |conn|
 conn.send_message "Сообщение", "my_adr@yandex.ru", "получатель@rambler.ru"
end


В этом случае, на почту получатель@rambler.ru приходит письмо (без темы) от MAILER-DAEMON@
со следующим содержанием:


  by mail172.rambler.ru (rmaild SMTP 1.2.41)
  
  with ESMTP id 292593804 for получатель@rambler.ru; Mon, 24 Aug 2015 11:13:46 +0300
  
  Received: from forward22m.cmail.yandex.net (forward22m.cmail.yandex.net [5.255.216.16])

    by mx2.mail.rambler.ru (Postfix) with ESMTP id 65FF15CA8
    for <получатель@rambler.ru>; Mon, 24 Aug 2015 11:13:46 +0300 (MSK) 

  
  Received: from smtp3m.mail.yandex.net (smtp3m.mail.yandex.net [IPv6:2a02:6b8:0:2519::125])

    by forward22m.cmail.yandex.net (Yandex) with ESMTP id 488F18046B
    for <получатель@rambler.ru>; Mon, 24 Aug 2015 11:13:46 +0300 (MSK)

  
  Received: from smtp3m.mail.yandex.net (localhost [127.0.0.1])

    by smtp3m.mail.yandex.net (Yandex) with ESMTP id 2C1A127A05B8
    for <получатель@rambler.ru>; Mon, 24 Aug 2015 11:13:46 +0300 (MSK)

  
  Received: by smtp3m.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id lnLUHk87ag-DjpWkB95;
  
  Mon, 24 Aug 2015 11:13:45 +0300
  
  (using TLSv1 with cipher AES128-SHA (128/128 bits))
  
  (Client certificate not present)
  
  Message-Id: <20150824111345.DjpWkB95@smtp3m.mail.yandex.net>
  
  Date: Mon, 24 Aug
  
  2015 11:13:45 +0300 
  
  From: MAILER-DAEMON 
  
  To: undisclosed-recipients:;
  
  X-Spam: yes


Вариант 2

Создание и использование рассыльщика FeedbackMailer

   #app/mailers/application_mailer.rb
    class ApplicationMailer < ActionMailer::Base 
    end

   #app/mailers/feedback_mailer.rb
    class FeedbackMailer < ApplicationMailer
    def feedback_email
      mail(from: 'my_adr@yandex.ru', to: 'получатель@rambler.ru', subject: 'тема')
    end
    end 

   #app/controllers/feedback_info_controller.rb
    def feedback_send
       FeedbackMailer.feedback_email
    end

  #config/environments/development.rb
    config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
    config.action_mailer.delivery_method = :smtp
    config.action_mailer.smtp_settings = {
        address: 'smtp.yandex.ru',
        port: 587,
        domain: 'yandex.ru',
        authentication: 'plain',
        user_name: 'my_adr@yandex.ru',
        password: 'пароль',
        enable_starttls_auto: true
    }


с такими настройками ничего не происходит
    


Ответы

Ответ 1



config.action_mailer.smtp_settings = { tls: true, ... Без этого yandex не работает. Причем tls: в официальной документации нет.

Ответ 2



Работает с такими настройками: #development.rb config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :tls => true, address: 'smtp.yandex.ru', port: 465, domain: 'yandex.ru', authentication: 'plain', user_name: 'name@yandex.ru', password: 'пароль' } #mailers/application_mailer.rb class ApplicationMailer < ActionMailer::Base end #mailers/feedback_mailer.rb class FeedbackMailer < ApplicationMailer def feedback_email (name, phone, comment) @name = name @phone = phone @comment = comment mail(from: 'name@yandex.ru', to: 'adrr@example.com', subject: 'Тема письма') end end #controllers/feedback_info_controller.rb def feedback_send @name = CGI.escapeHTML(params[:feedback_info][:name]) @phone = CGI.escapeHTML(params[:feedback_info][:phone]) @comment = CGI.escapeHTML(params[:feedback_info][:comment]) FeedbackMailer.feedback_email(@name,@phone,@comment).deliver_now end

Ответ 3



Во втором варианте вы пропустили, собственно, доставку. Вы создали объект письма, но не запустили отправку. С Rails 4.2+ можно спокойно использовать .deliver_later: FeedbackMailer.feedback_email.deliver_later Но сначала перечитайте руководство, особенно этот абзац: Поведением Active Job по умолчанию является запуск заданий :inline. Поэтому можно использовать deliver_later для отсылки писем прямо сейчас, а если позже решите отправлять письма в фоновой задаче, вам нужно будет всего лишь настроить Active Job для использования бэкэнда очередей (Sidekiq, Resque и т.п.).

Ответ 4



В Rails 5 для настройки в config/environments/production.rb добавил: config.action_mailer.default_url_options = { host: 'www.yoursite.ru' } config.action_mailer.perform_deliveries = true config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { tls: true, address: "smtp.yandex.com", port: 465, domain: "yandex.com", authentication: "plain", enable_starttls_auto: true, user_name: 'youremail@yandex.ru', password: 'yourpassword' } Все отлично работает, в том числе с почтой для домена (pdd.yandex.ru). Однако в отличии от gmail, письмо не сохраняется в папке отправленные на сервере.

суббота, 14 декабря 2019 г.

Битрикс и Яндекс касса , почему разные номера заказов

#битрикс #яндекс


Доброго времени суток ! На сайте реализована многосайтовость, два ИМ на которых можно
оформлять заказы, подключена яндекс касса. В аккаунте яндекс кассы прописаны ссылки:

Check URL https://site1.ru/bitrix/tools/sale_ps_result.php

Aviso URL https://site1.ru/bitrix/tools/sale_ps_result.php

Success URL http://site1.ru/bitrix/tools/sale_ps_success.php

Fail URL http://site1.ru/bitrix/tools/sale_ps_fail.php


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

В файле /bitrix/tools/sale_ps_success.php я хочу сделать редирект , как мне показалось
что это можно сделать получив ID заказа из URL который формирует яндекс касса в случае
успешной оплаты, в котором есть параметр orderNumber=273 . Но заметил что номер заказа
в яндекс кассе не совпадают с номером заказа на сайте. К примеру если а ЯК это 273
то на сайте 280 . 
И итог того что хочу сделать:
Получить номер заказа из URL, в файле sale_ps_success.php проверить  какому сайту
пренадлежит заказ и сделать редиррект на нужный сайт https://site2/personal/order/make/?ORDER_ID=".$OrderID

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

По совету Mihanik71  использовать класс Bitrix\Sale\Internals\PaymentTable оказалось
верным решением за что ему большое спасибо, ниже пример кода который в файле(sale_ps_success.php)
я запилил у себя на сайте:



   $orderNumbder = $_GET['orderNumber']; // тут приходит номер оплаты 


CModule::IncludeModule("sale");
 c
$obj = new Bitrix\Sale\Internals\PaymentTable; // класс с помощью которого можно
вытащить id заказа, был обнаружен с помощью модуля live ip

$shimpentCode = $obj->getlist(array('select' => array('ID','ORDER_ID'),'filter' =>
array('ID' => $orderNumbder)))->fetch();

$SiteOrder = CSaleOrder::GetByID($shimpentCode['ORDER_ID']); // вытаскиваем свойства
заказа, нас интересует поле LID

$SiteID = $SiteOrder['LID']; // id сайта на котором была покупка 

$OrderID = $shimpentCode['ORDER_ID'];

$successUrl = "";
// простое условие , выбираем куда редиректить покупателя 
if($SiteID == 's1'){
   $successUrl = "https://site1.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y";
// параметр PAY=Y добавил для своих нужд   
}
if($SiteID == 's2'){
   $successUrl = "https://site2.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y";
}


$successPath = COption::GetOptionString("sale", "sale_ps_success_path", "/");

   if(!empty($successUrl)){
      LocalRedirect($successUrl);   
   }
}

    


Ответы

Ответ 1



Есть класс Bitrix\Sale\Internals\PaymentTable там по номеру оплаты поле ID можно получить номер заказа ORDER_ID.

Ответ 2



Ваше решение не совсем верно с точки зрения нового ядра D7 Битрикс. Нежелательно использовать API старого ядра, когда есть аналоги нового. К тому же было бы неверно использовать Bitrix\Sale\Internals\PaymentTable, потому что нет гарантий, что данное поведение функции сохраниться в дальнейшем, а именно: Подпространство Bitrix\Sale\Internals содержит классы для работы с таблицами модуля Интернет-магазин. Важно! Прямое использование данных классов не рекомендуется и совместимость не гарантируется. https://dev.1c-bitrix.ru/api_d7/bitrix/sale/internals/ Гораздо лучше использовать доступные публичные статические методы: //Вместо CModule::IncludeModule("sale"); \Bitrix\Main\Loader::includeModule('sale'); //Вместо создания объекта класса Bitrix\Sale\Internals\PaymentTable $payment = \Bitrix\Sale\Payment::getList( array( "filter" => array('ID' => $_GET['orderNumber']), "select" => array('ORDER_ID') ) ); $paymentFields = $payment->fetch(); //Поднимаем объект заказа по id $order = \Bitrix\Sale\Order::load($paymentFields['ORDER_ID']); //Получаем поле 'LID' $SiteID = $order->getField('LID'); //'ID' заказа можно получить и из заказа тоже, например: $OrderID = $order->getId() $OrderID = $paymentFields['ORDER_ID']; $successUrl = ""; // простое условие , выбираем куда редиректить покупателя if($SiteID == 's1') { $successUrl = "https://site1.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y"; // параметр PAY=Y добавил для своих нужд } if($SiteID == 's2') { $successUrl = "https://site2.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y"; } if(!empty($successUrl)) { LocalRedirect($successUrl); } Можно еще и $_GET['orderNumber'] через API получать, но это уже так, легкое ООП извращение: $request = \Bitrix\Main\Context::getCurrent()->getRequest(); $request->get("orderNumber");

воскресенье, 8 декабря 2019 г.

Как на яндекс карте показать районы города?

#javascript #веб_программирование #yandex_maps_api #яндекс #карты


Есть задача показать административные районы города на яндекс картах. 
При этом каждый район должен иметь свой цвет и прозрачность.
Например, здесь отображается один район города:
на Яндекс Карте

Нужно показать все( или несколько) районы(ов) города и иметь возможность задать им
цвет и прозрачность через API.
Подскажите, как это можно сделать?

UPD1. Есть идея сделать районы в виде полигонов. Тогда можно будет править их как
угодно. Но нужны координаты границ районов. Карта яндекса откуда же берет эти данные.
Вот как их получить?  

UPD2. Получен официальный ответ от тех поддержки Яндекс Карт.
"Средствами АПИ Яндекс карт сделать это нельзя". Так что испольуем OSM.
    


Ответы

Ответ 1



Общий план действий такой: ymaps.ready(function() { // 0. Создаем карту, например так: var map, regionName = "Краснодар, Западный округ", center = [38.943216, 45.033266], zoom = 11; map = new ymaps.Map('yamap', { center: center, zoom: zoom, controls: [] }); // 1. Запрашиваем через геокодер район (у Яндекса этой возможности пока нет, придется пользоваться OSM) var url = "http://nominatim.openstreetmap.org/search"; $.getJSON(url, {q: regionName, format: "json", polygon_geojson: 1}) .then(function (data) { $.each(data, function(ix, place) { if ("relation" == place.osm_type) { // 2. Создаем полигон с нужными координатами var p = new ymaps.Polygon(place.geojson.coordinates); // 3. Добавляем полигон на карту map.geoObjects.add(p); } }); }, function (err) { console.log(err); }); }); Этап 1, в качестве примера, приведен с использованием jQuery. Этап 2 скрывает небольшую проблему. OSM возвращает координаты в порядке (долгота, широта), Яндекс работает по-умолчанию с порядком (широта, долгота). Чтобы это поменять нужно указать порядок при подключении API Также на этапе 2 можно добавить "по вкусу" цвет фона, обводку, прозрачность и многое другое см. Polygon

воскресенье, 1 декабря 2019 г.

Как работает код счетчика метрики?

#javascript #яндекс #yandex_metrika_api


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

(function(d, w, c) {
(w[c] = w[c] || []).push(function() {
    try {
        w.yaCounterCOUNTER_ID = new Ya.Metrika({
            id: COUNTER_ID,
            clickmap: true,
            trackLinks: true,
            accurateTrackBounce: true,
            webvisor: true
        });
    } catch (e) {}
});
var n = d.getElementsByTagName("script")[0],
    s = d.createElement("script"),
    f = function() {
        n.parentNode.insertBefore(s, n);
    };
s.type = "text/javascript";
s.async = true;
s.src = "https://mc.yandex.ru/metrika/watch.js";
if (w.opera == "[object Opera]") {
    d.addEventListener("DOMContentLoaded", f, false);
} else {
    f();
}
})(document, window, "yandex_metrika_callbacks");


Не очень ясна конструкция в самом начале функции. Каким образом будет создан новый
объект Ya.Metrika, если его фактически в коде нет, а сам скрипт watch.js подгружается
в коде позже? 

И как здесь все-таки работает добавление самого скрипта watch.js? Ведь если посмотреть
код страницы с установленным счетчиком, тег script с параметрами и путем к watch.js
не будет виден в коде страницы. 

Заранее спасибо за объяснения!
    


Ответы

Ответ 1



Отличный вопрос! Давайте по-порядку: 1. Объявление и вызов главной функции (function(d, w, c) { ... })(document, window, "yandex_metrika_callbacks"); Здесь вы объявляете некую функцию, и сразу после объявления - ее же и вызываете с параметрами document, window и строковым ключом Яндекс.Метрики. Эти параметры используются внутри функции. 2. Сохранение конструктора метрики w[c] = w[c] || [] w - это ваше окно браузера. В нем вы можете хранить функции или данные, и они будут доступны глобально в других скриптах. По сути, здесь вы обращаетесь к w["yandex_metrika_callbacks"], и там либо уже будут какие-то значения (например, с других счетчиков Яндекс.Метрики), либо объявленный вами пустой массив. .push(function() { ... ); И далее в этот массив (уже существующий или только что созданный) вы добавляете элемент - функцию, которая попытается создать объект счетчика метрики. w.yaCounterCOUNTER_ID = new Ya.Metrika({ .. }); Создаете объект снова у окна w, чтобы он был доступен в любых других скриптах. 3. Асинхронная загрузка скрипта метрики n = d.getElementsByTagName("script")[0] Здесь вы находите первый попавшийся у вас на сайте тег

Как сделать так, чтобы не было подобных соединений?


Ответ

Может у вас там по Плоткина одностороннее движение?
Точнее, на неё нет поворота с перекрёстка.
Маршрут построен правильно, чтобы пройти по точкам, приходится делать круг..
Более простой маршрут
Знак на gmaps

пятница, 5 апреля 2019 г.

Как вывести точки на яндекс карте на основании json файла?

День добрый! Например, вот json файл data.json
{ "Points":[{ "MapPoinName": "Город 1", "MapPointPopulation": 125000, "MapPointCoordinates": "58.211748, 59.979321" }, { "MapPoinName": "Город 2", "MapPointPopulation": 105000, "MapPointCoordinates": "51.221748, 53.929321" }]
}
Вывожу так:
Карта возможностей и проблем


Данные из json получаю, но код внутри for (var i = 0; i < data.Points.length; i++) не выполняется


Ответ

Вот пример JavaScript кода для вывода точек с кластеризацией:
ymaps.ready(init); function init() { var map = new ymaps.Map("map", { center: [55.76, 37.57], zoom: 5, controls: ['zoomControl', 'searchControl'] }); $.getJSON('data.json', function(data) { // Создадим объект точек из data.Points var myGeoObjects = data.Points.map(item => { return new ymaps.GeoObject({ geometry: { type: "Point", // Переведем строку с координатами в массив coordinates: item.MapPointCoordinates.split(', ') }, properties: { clusterCaption: 'Описание в кластере', balloonContentBody: [ '

', '

Данные

', 'Данные: МО "Название МО"
', 'Данные: ФИО Главы МО
', '
' ].join('') } }, { preset: "islands#darkGreenDotIcon", }); }) // Создадим кластеризатор после получения и добавления точек var clusterer = new ymaps.Clusterer({ preset: 'islands#invertedDarkGreenClusterIcons', clusterDisableClickZoom: true, clusterBalloonContentLayoutWidth: 800, clusterBalloonLeftColumnWidth: 160 }); clusterer.add(myGeoObjects); map.geoObjects.add(clusterer); map.setBounds(clusterer.getBounds(), { checkZoomRange: true }); }) }