Страницы

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

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

Создание объекта класса через родителя. Python

#python #ооп

                    
Пишу калькулятор на python. У меня есть 2 типа кнопок: цифры и  операции. Описал
3 класса: класс кнопки(родитель), классы кнопки-операции и кнопки-цифры(дочерние).

class Button:
    pass

class NumberButton(Button):
    pass

class OperationButton(Button):
   pass


Есть макет калькулятора, сделанный на PyQt5, где каждая кнопка имеет имя:

а) num0, num1, num2, ... , num9 - кнопки цифр

б) op_plus, op_minus,  op_divide, op_multiply - кнопки операций

Вопрос. Как можно вынести конструктор в класс-родителя Button, чтобы я, смог создавать
объект класса через базовый класс, который сам бы определял, объект какого дочернего
класса нужно создать?

Хочу:

button = Button(button_name)


Не хочу:

if button_name == num0 or ... button_name == num0:
    button = NumberButton(button_name)
else:
    button = OperationButton(button_name)

    


Ответы

Ответ 1



Примерно как-то так: class Button: def __new__(cls, name): if 'num' in name: return NumberButton(name) else: return OperationButton(name)

Запуск события на определенном блоке при скролле с использованием malihu custom scrollbar

#javascript #jquery

                    
В продолжение вопроса.

Использую плагин malihu custom scrollbar

Есть такая простейшая структура:



$(window).load(function(){
  var container = $('#container');  
    
  container.mCustomScrollbar({
        	axis:"x",
            theme:"dark-3",
            // scrollbarPosition: 'outside',
            advanced:{ autoExpandHorizontalScroll:true },
            autoScrollOnFocus: true,

            callbacks:{
              whileScrolling:function(){
                var 
                windowWidth = $(window).width(),
                    thisLeft, 
                    thisWidth;

                $('section').each(function(){
                  thisLeft = $(this).offset().left;
                  thisWidth = $(this).width();

                  if(thisLeft < windowWidth ){
                    console.log($(this).attr('id'));
                  }else{

                  }
                });

              }
            }
        });   
  
});
main {
    display: flex;
    flex-flow: row nowrap;
    align-items: center;
    align-content: center;
    justify-content: space-between;
}

section {
    display: block;
    width: 500px;
    border: 1px solid #000;
    padding: 1rem;
    margin-bottom: 2rem;
}

.js-page-scroll {
    width: 100%;
    overflow-x: auto;
}






1

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

2

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

3

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

4

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

5

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

Суть проблемы в том, что при доскролле до секции должен выводится ее номер (в консоле) единожды, т.е при обратном скролле ничего в консоле не выводить. Конкретная задача с реализацией TweenMax: $(window).load(function(){ var windowWidth = $(window).width(); var thisLeft, thisWidth; function animateBlocks(){ // $('.animated').each(function(){ // thisLeft = $(this).offset().left; // thisWidth = $(this).width(); // if(thisLeft < windowWidth ){ // $(this).addClass('fadeInUp'); // }else{ // $(this).removeClass('fadeInUp'); // } // }); $('h2').each(function(){ var title = $(this); thisLeft = $(this).offset().left; thisWidth = $(this).width(); if(thisLeft < windowWidth ){ TweenMax.fromTo( title, 1, {scale: 0}, {scale: 1, ease: Elastic.easeOut.config(1, 0.5)} ); }else{ //$(this).removeClass('fadeInUp'); } }); } animateBlocks(); // Horizontal scroll var container = $('.js-page-scroll'); if(container.length){ container.mCustomScrollbar({ axis:"x", theme:"dark-3", // scrollbarPosition: 'outside', advanced:{ autoExpandHorizontalScroll:true }, autoScrollOnFocus: true, callbacks:{ whileScrolling:function(){ animateBlocks(); } } }); } $(document).on("click","a[href^='#']",function(e){ var href=$(this).attr("href"),target=$(href).parents(".mCustomScrollbar"); if(target.length){ e.preventDefault(); target.mCustomScrollbar("scrollTo",href); } }); }); main { display: flex; flex-flow: row nowrap; align-items: center; align-content: center; justify-content: space-between; } section { display: block; width: 500px; border: 1px solid #000; padding: 1rem; margin-bottom: 2rem; } .js-page-scroll { width: 100%; overflow-x: auto; } .horizontal-wow { visibility: hidden; animation-name: null; } it-1 it-2 it-3 it-4 it-5

1

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

2

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

3

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

4

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

5

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

Вопрос: Как, при скролле, запускать событие соответствующего блока единожды (добавить класс или вывести сообщение в консоли)? Для конкретного случая - запуск tweenMax единожды при достижении определенного блока, при обратном скролле - отмена (не запускать еще раз tweenmax). Т.е. запуск анимации, добавление класс, alert и прочее только раз после загрузки при скролле вперед и при попадании на определенный блок (есди section-1 - console.log(item-1) \ tweenmax1 , и т.д ...).


Ответы

Ответ 1



Решение: добавлять на каждый блок атрибут done='true' при первом запуске. Далее на запуск функции проверяем выставлен ли атрибут, если выставлен, то ничего не делаем, если не выставлен - вызываем функцию и устанавливаем done='true'. $(window).load(function(){ var container = $('#container'); container.mCustomScrollbar({ axis:"x", theme:"dark-3", // scrollbarPosition: 'outside', advanced:{ autoExpandHorizontalScroll:true }, autoScrollOnFocus: true, callbacks:{ whileScrolling:function(){ var windowWidth = $(window).width(), thisLeft, thisWidth; $('section').each(function(){ thisLeft = $(this).offset().left; thisWidth = $(this).width(); if(thisLeft < windowWidth ){ if(!this.getAttribute("done")) { console.log($(this).attr('id')); this.setAttribute("done",true); } }else{ } }); } } }); }); main { display: flex; flex-flow: row nowrap; align-items: center; align-content: center; justify-content: space-between; } section { display: block; width: 500px; border: 1px solid #000; padding: 1rem; margin-bottom: 2rem; } .js-page-scroll { width: 100%; overflow-x: auto; }

1

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

2

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

3

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

4

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?

5

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima dolorum cumque fugiat ducimus rem dicta sequi neque laudantium, facilis explicabo?



Баг IE: контейнер заканчивается раньше дочернего центровщика

#html #css #internet_explorer

                    
Очень трудно было выбрать тему для данного вопроса: "У меня не так отображается,
помогите!" - это не тема, но дело в том, что в данном вопросе рассматривается очередной
баг Internet Explorer (то есть в других браузерах всё отображается нормально), причину
которого никак не удаётся выяснить.

К задаче. У нас типичный блок .Wrapper, который имеет ширину 100% от окна, и центровщик
(margin: 0 auto;) с указанными min-width и max-width:



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



Такой баг был замечен уже практически на свёрстанном лендинге, а потому было очень
трудно сделать минимальный работающий пример. Я постарался убрать весь лишний HTML
для данного примера, но CSS тоже самое было сделать очень трудно. 

Если Вы запустите пример в IE (ещё раз повторюсь, что в других браузерах всё нормально),
то увидите следующее:



Расскажу о том, что обнаружил сам. Сама по себе верхняя компоновка Wrapper-Centerer-Содержимое
отображается корректно (её содержимое - таблица). Баг появляется при появлении нижней
комбинации. Вообще там есть внутренний контейнер с зафлоченными элементами, но всё
равно неясно, в чём проблема. Естественно, везде где надо, есть overflow: hidden;.
    


Ответы

Ответ 1



К section добавьте flex: 1 0 auto: https://jsfiddle.net/Kniha/mLh63fao/3/ В примере добавлено через section[class$='-RootWrapper'].

Как автоматически перезапускать плейбук?

#bash #ansible #devops

                    
Конфигурация проходит через VPN и возникают периодические отваливания в соединении,
что приводит к остановке плейбука для данного хоста.

Если в самом Ansible инструмент, перезапускающий плейбук до тех пор, пока .retry
не останется пустым?

Пока вижу выход в небольшом баш скрипте с whle true циклом.
    


Ответы

Ответ 1



Подобных средств на уровне плейбука не знаю, а бесконечный while это откровенный костыль. Вам могут помочь следующие вещи: включите pipelining в скриптах ansible чтобы увеличить скорость выполнения скрипта увеличьте таймаут ssh на своём сервере включите в конфиге retries если вышеперечисленное не помогло, то подумайте о режиме ansible-pull (выполнять скрипты локально на самом сервере) Также можно подумать о том, чтобы каждый шаг плейбука переписать в стиле: --- - hosts: all connection: local tasks: - shell: exit 1 register: task_result until: task_result.rc == 0 retries: 10 delay: 1 ignore_errors: yes

Возможно ли ограничение зоны поиска DOM?

#javascript

                    
Можно ли, например, для метода getElementById, сократить область поиска со всей страницы
до какой-либо отдельной части HTML-документа? В примере

можно конечно, сначала найти container, а потом внутри него уже искать element, но container-то мы ищём опять же по всему документу, а это нерационально в больших документах. Можно ли как-то ограничить зону поиска?


Ответы

Ответ 1



Что-то мне подсказывает, что при построении дерева все ссылки на элементы ID собираю в одном месте и потом используются для быстрого поиска по дереву. Поэтому то, что вы хотите оптимизировать и так уже оптимизировано. Но не буду этого утверждать. В общем как один из вариантов, можно натыкать меток и ограничивать ими, если уж так хочется. По крайней мере они точно собраны в одном месте и до них легко добраться. console.log( document.anchors["part_2"].innerText )

Ответ 2



Даже не могу сообразить для чего тебе это надо. id - идентификатор уникальный и может быть только в единственном экземпляре на все странице. И даже если данный экземпляр будет в начале страницы или где-то далеко и обернут в тысячу родительских блоков, это ни как не повлияет на скорость его обнаружения.... Ну может на миллионную долю секунды.... Так что в этом нет ни какого смысла....

Ответ 3



Можно. Это имеет смысл для поиска например по имени тега, классу или более сложному селектору. Но для поиска по id это смысла не имеет, так как все id хранятся в хэш таблице и поиск по ней происходит очень быстро (за константное время операций), и там уже нечего ускорять. var area = document.getElementById("searchArea"); var els = area.getElementsByTagName("p"); /* можно и по id поискать, но скорее всего это будет медленнее чем поиском через document.getElementById */ var el1 = area.querySelector("#id1"); console.log(Array.from(els)); console.log(el1);

some text

11

22

some text



SDL_CreateThread и барьер памяти

#cpp #c #многопоточность #sdl2

                    
До запуска дополнительного потока создается семафор, который используется в создаваемом
потоке:

// Main thread:
SDL_sem* sem = SDL_CreateSemaphore(0);
SDL_CreateThread(...);

...

// Second thread:
SDL_SemWait(sem);


Вопрос - могут ли поменяться местами (компилятором/процессором) создание семафора
и потока? (и возникнет ошибка при обращении к ещё не созданному семафору в новом потоке).
    


Ответы

Ответ 1



Ключевое свойство всех оптимизаций компиляторов придерживающихся стандартов в том, что они не меняют результат вычислений, если в исходном коде нет UB. Исходя из этого можно быть вполне уверенным, что компилятор не переставит местами вызовы функций, покуда не будет точно уверен, что у них нет побочных эффектов (например, для gcc если они не объявлены с __attribute__(pure)). Таким образом, если вызов SDL_CreateSemaphore(0) идёт до SDL_CreateThread(...), то можно не боятся, что при исполнении они как-то поменяются... Конечно всегда может представить сферический компилятор в вакууме, который делает всё что ему вздумается, но это уже совсем другая история... Также может быть столь же сферическая библиотека реализующая свои вызовы, как отложенные, но это уже проблема библиотеки, и пользователь об этом беспокоиться не должен... И ни к любой вменяемой реализации SDL, ни к любому вменяемому компилятору это всё не относится...

Проблема при загрузке .css

#css #bootstrap #google_chrome #angular_cli

                    
Файл .css почему-то не подгружается, выводя в консоли ошибку:


  Refused to apply style from
  'http://localhost:3000/node_modules/bootstrap/dist/css/bootstrap.min.css'
  because its MIME type ('text/html') is not a supported stylesheet MIME
  type, and strict MIME checking is enabled.


Может, кто сталкивался с такой проблемой, заранее спасибо!


Ссылка на файл "bootstrap.min.css":
https://www.dropbox.com/s/ij4v7pchuksannc/bootstrap.min.css?dl=0
    


Ответы

Ответ 1



Судя по всему проект на Angular2+ и после компеляции нет доступа к папке Node Modules, а вместо файла возврящяеться текстовая страница. Попробуйте подключить этот файл в ./src/styles.css @import "~bootstrap/dist/css/bootstrap.min.css" ~ - это маска для пути к node_modules, webpack расшифрует и подставит нужный файл в сборку Angular.

Ответ 2



Возможная проблема в том, что в файле css могут быть комментарии, но программа считает, что это некорректный формат для css. Уберите комментарии из css и проверьте. Возможно нужно убрать комментарии только из начала файла. Если причина не в этом, то было бы неплохо предоставить содержимое файла css.

Как в Windows Forms сделать надчеркивание?(логическое отрицание)

#c_sharp #winforms

                    
Именно на формах, а не на wpf. 
Допустим, по нажатию кнопки выделенный текст надчеркивается, например: 

    


Ответы

Ответ 1



В WinForms с красивостями плохо. Надчеркивание стандартными средствами не возможно в принципе, т.к. за стиль шрифта в System.Drawing (GDI+) отвечает перечисление FontStyle, которое ни чего не знает о надчеркивании. RichTextBox тут тоже не помощник, потому что его контент рисует все тот же System.Drawing (GDI+). В этом легко убедиться на примере стандартного WordPad, в котором раскрыты все или почти все возможности RichTextBox в плане форматирования текста, не хватает только некоторых возможностей rtf-разметки, которые впрочем не особенно и нужны в виду наличия более удобных и современных форматов. Альтернативные варианты: Для одной буквы можно воспользоваться комбинированными символами unicode, а именно символом надчеркивания: код 0x0305, например так: "a\x0305" - a̅; или так:"Y\x0305" - Y̅. Для длинного текста такой вариант не подходит, т.к. потребуется вставлять этот символ после каждой буквы текста. Плюс ко всему, такие составные символы не всегда корректно отображаются, надстрочные и подстрочные знаки могут "съезжать" в сторону, например так: ы̅ Можно разместить на форме хостинг для WPF контролов ElementHost и воспользоваться всей оформительской мощью WPF. На самый крайний случай всегда остается возможность просто нарисовать и текст и линии надчеркивания средствами System.Drawing (GDI+) на обычном Bitmap или прямо на контроле, но как вы понимаете, ни каком выделении текста мышкой и редактировании не может быть и речи, если конечно вы не страдаете от острого приступа мазохизма и/или трудоголизма =) ну или интерес исключительно академического характера.

Ошибка Failed to re-package resources

#android #c_sharp #unity3d #unity3d_android

                    
Помогите определить в чем ошибка и как ее исправить. Спасибо.

Проект не обновленный, поддерживает версию Android 4.0 API level 14 и наблюдаю следующие
ошибки:

  CommandInvokationFailure: Failed to re-package resources.
    E:\AD\sdk\build-tools\25.0.0\aapt.exe package --auto-add-overlay -v -f -m -J
"gen" -M "AndroidManifest.xml" -S "res" -I "E:\AD\sdk\platforms\android-27\android.jar"
-F bin/resources.ap_ --extra-packages com.appodeal.ads.unity:com.facebook.android:com.google.android.gms:com.google.unity:com.appodeal.inmobi.unity:com.google.android.gms.ads.impl:com.google.android.gms.ads:com.google.android.gms.base:com.google.android.gms:com.google.android.gms.clearcut:com.google.android.gms.gass:com.google.android.gms.location:com.google.android.gms.tasks:android.support.compat:android.support.coreui:android.support.coreutils:android.support.fragment:android.support.mediacompat:android.support.v4:com.unity3d.ads:com.unity3d.ads.android:com.appodeal.yandexmetrica.unity
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\facebook\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\google-play-services_lib\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\play-services-ads-9.8.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\play-services-ads-lite-9.8.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\play-services-base-9.8.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\play-services-basement-9.8.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\play-services-clearcut-9.8.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\play-services-gass-9.8.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\play-services-location-9.8.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\play-services-tasks-9.8.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\support-compat-25.2.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\support-core-ui-25.2.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\support-core-utils-25.2.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\support-fragment-25.2.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\support-media-compat-25.2.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\support-v4-25.2.0\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unity-ads\res"
-S "E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res"

    stderr[
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml:2:
note: removing attribute http://schemas.android.com/apk/res/android:paddingStart from

    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml:61:
note: removing attribute http://schemas.android.com/apk/res/android:layout_marginStart
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml:27:
note: removing attribute http://schemas.android.com/apk/res/android:layout_alignParentStart
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml:27:
note: removing attribute http://schemas.android.com/apk/res/android:layout_marginStart
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml:52:
note: removing attribute http://schemas.android.com/apk/res/android:layout_marginStart
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml:44:
note: removing attribute http://schemas.android.com/apk/res/android:layout_marginStart
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml:19:
note: removing attribute http://schemas.android.com/apk/res/android:layout_alignParentStart
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml:10:
note: removing attribute http://schemas.android.com/apk/res/android:layout_marginStart
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml:
note: using v17 attributes; synthesizing resource com.oriplay.lamphead:layout/unityads_button_audio_toggle
for configuration v17.
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_pause.xml:8:
note: removing attribute http://schemas.android.com/apk/res/android:layout_marginStart
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_pause.xml:
note: using v17 attributes; synthesizing resource com.oriplay.lamphead:layout/unityads_button_pause
for configuration v17.
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_view_video_play.xml:92:
note: removing attribute http://schemas.android.com/apk/res/android:layout_alignParentStart
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_view_video_play.xml:57:
note: removing attribute http://schemas.android.com/apk/res/android:layout_alignParentEnd
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_view_video_play.xml:57:
note: removing attribute http://schemas.android.com/apk/res/android:layout_marginEnd
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_view_video_play.xml:44:
note: removing attribute http://schemas.android.com/apk/res/android:layout_marginEnd
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_view_video_play.xml:29:
note: removing attribute http://schemas.android.com/apk/res/android:layout_marginStart
from 
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_view_video_play.xml:
note: using v17 attributes; synthesizing resource com.oriplay.lamphead:layout/unityads_view_video_play
for configuration v17.
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\google-play-services_lib\res\values\common_attrs.xml:13:
error: Attribute "imageAspectRatioAdjust" already defined with incompatible format.
    E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\play-services-base-9.8.0\res\values\values.xml:34:
Original attribute defined here.
    ]
    stdout[
    Configurations:
     (default)

    Files:
      drawable\unityads_background_button_pause.xml
        Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\drawable\unityads_background_button_pause.xml
      drawable\unityads_icon_play.xml
        Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\drawable\unityads_icon_play.xml
      drawable\unityads_icon_speaker_base.xml
        Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\drawable\unityads_icon_speaker_base.xml
      drawable\unityads_icon_speaker_triangle.xml
        Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\drawable\unityads_icon_speaker_triangle.xml
      drawable\unityads_icon_speaker_waves.xml
        Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\drawable\unityads_icon_speaker_waves.xml
      layout\unityads_button_audio_toggle.xml
        Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml
      layout\unityads_button_pause.xml
        Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_pause.xml
      layout\unityads_view_video_paused.xml
        Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_view_video_paused.xml
      layout\unityads_view_video_play.xml
        Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_view_video_play.xml
      values\strings.xml
        Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\values\strings.xml
      AndroidManifest.xml
        Src: () AndroidManifest.xml

    Resource Dirs:
      Type drawable
        drawable\unityads_background_button_pause.xml
          Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\drawable\unityads_background_button_pause.xml
        drawable\unityads_icon_play.xml
          Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\drawable\unityads_icon_play.xml
        drawable\unityads_icon_speaker_base.xml
          Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\drawable\unityads_icon_speaker_base.xml
        drawable\unityads_icon_speaker_triangle.xml
          Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\drawable\unityads_icon_speaker_triangle.xml
        drawable\unityads_icon_speaker_waves.xml
          Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\drawable\unityads_icon_speaker_waves.xml
      Type layout
        layout\unityads_button_audio_toggle.xml
          Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_audio_toggle.xml
        layout\unityads_button_pause.xml
          Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_button_pause.xml
        layout\unityads_view_video_paused.xml
          Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_view_video_paused.xml
        layout\unityads_view_video_play.xml
          Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\layout\unityads_view_video_play.xml
      Type values
        values\strings.xml
          Src: () E:\A_Project\oriplaygames-lamphead-AndroidBuild-333333333333\Temp\StagingArea\android-libraries\unityads\res\values\strings.xml
    Including resources from package: E:\AD\sdk\platforms\android-27\android.jar
    applyFileOverlay for drawable
    trying overlaySet Key=common_full_open_on_phone.png
    trying overlaySet Key=common_google_signin_btn_icon_dark.xml
    trying overlaySet Key=common_google_signin_btn_icon_dark_disabled.9.png
    trying overlaySet Key=common_google_signin_btn_icon_dark_focused.xml
    trying overlaySet Key=common_google_signin_btn_icon_dark_normal.9.png
    trying overlaySet Key=common_google_signin_btn_icon_dark_pressed.9.png
    trying overlaySet Key=common_google_signin_btn_icon_light.xml
    trying overlaySet Key=common_google_signin_btn_icon_light_disabled.9.png
    trying overlaySet Key=common_google_signin_btn_icon_light_focused.xml
    trying overlaySet Key=common_google_signin_btn_icon_light_normal.9.png
    trying overlaySet Key=common_google_signin_btn_icon_light_pressed.9.png
    trying overlaySet Key=common_google_signin_btn_text_dark.xml
    trying overlaySet Key=common_google_signin_btn_text_dark_disabled.9.png
    trying overlaySet Key=common_google_signin_btn_text_dark_focused.xml
    trying overlaySet Key=common_google_signin_btn_text_dark_normal.9.png
    trying overlaySet Key=common_google_signin_btn_text_dark_pressed.9.png
    trying overlaySet Key=common_google_signin_btn_text_light.xml
    trying overlaySet Key=common_google_signin_btn_text_light_disabled.9.png
    trying overlaySet Key=common_google_signin_btn_text_light_focused.xml
    trying overlaySet Key=common_google_signin_btn_text_light_normal.9.png
    trying overlaySet Key=common_google_signin_btn_text_light_pressed.9.png
    trying overlaySet Key=cast_ic_notification_0.png
    trying overlaySet Key=cast_ic_notification_1.png
    trying overlaySet Key=cast_ic_notification_2.png
    trying overlaySet Key=cast_ic_notification_connecting.xml
    trying overlaySet Key=cast_ic_notification_on.png
    trying overlaySet Key=common_full_open_on_phone.png
    baseFile 0 has flavor hdpi-v4
    baseFile 1 has flavor xhdpi-v4
    overlayFile 0 has flavor mdpi-v4
    overlayFile 1 has flavor tvdpi-v4
    overlayFile 2 has flavor hdpi-v4
    overlayFile 3 has flavor xhdpi-v4
    overlayFile 4 has flavor xxhdpi-v4
    nothing matches overlay file common_full_open_on_phone.png, for flavor mdpi-v4
    nothing matches overlay file common_full_open_on_phone.png, for flavor tvdpi-v4
    found a match (2) for overlay file common_full_open_on_phone.png, for flavor hdpi-v4
    found a match (3) for overlay file common_full_open_on_phone.png, for flavor xhdpi-v4
    nothing matches overlay file common_full_open_on_phone.png, for flavor xxhdpi-v4
    trying overlaySet Key=common_ic_googleplayservices.png
    trying overlaySet Key=common_signin_btn_icon_dark.xml
    trying overlaySet Key=common_signin_btn_icon_disabled_dark.9.png
    trying overlaySet Key=common_signin_btn_icon_disabled_focus_dark.9.png
    trying overlaySet Key=common_signin_btn_icon_disabled_focus_light.9.png
    trying overlaySet Key=common_signin_btn_icon_disabled_light.9.png
    trying overlaySet Key=common_signin_btn_icon_focus_dark.9.png
    trying overlaySet Key=common_signin_btn_icon_focus_light.9.png
    trying overlaySet Key=common_signin_btn_icon_light.xml
    trying overlaySet Key=common_signin_btn_icon_normal_dark.9.png
    trying overlaySet Key=common_signin_btn_icon_normal_light.9.png
    trying overlaySet Key=common_signin_btn_icon_pressed_dark.9.png
    trying overlaySet Key=common_signin_btn_icon_pressed_light.9.png
    trying overlaySet Key=common_signin_btn_text_dark.xml
    trying overlaySet Key=common_signin_btn_text_disabled_dark.9.png
    trying overlaySet Key=common_signin_btn_text_disabled_focus_dark.9.png
    trying overlaySet Key=common_signin_btn_text_disabled_focus_light.9.png
    trying overlaySet Key=common_signin_btn_text_disabled_light.9.png
    trying overlaySet Key=common_signin_btn_text_focus_dark.9.png
    trying overlaySet Key=common_signin_btn_text_focus_light.9.png
    trying overlaySet Key=common_signin_btn_text_light.xml
    trying overlaySet Key=common_signin_btn_text_normal_dark.9.png
    trying overlaySet Key=common_signin_btn_text_normal_light.9.png
    trying overlaySet Key=common_signin_btn_text_pressed_dark.9.png
    trying overlaySet Key=common_signin_btn_text_pressed_light.9.png
    trying overlaySet Key=ic_plusone_medium_off_client.png
    trying overlaySet Key=ic_plusone_small_off_client.png
    trying overlaySet Key=ic_plusone_standard_off_client.


Что я пробовал: 


менял версии build-tools 23.0.1 и до 25, не помогло.
выставил один и тот же во всех имеющихся манифестов minSDKVersion и соответствующий
targetSDKVersion, тоже не помогло.


Содержатся такие плагины:


OpenIAB
FaceBook 
Appodeal 
UnityAds 
Admob 
Google Play Services версии
7571000

    


Ответы

Ответ 1



Похоже на дублирование библиотек. Некоторые плагины тянут с собой доп. библиотеки. Очень часто support-v4. И они, как правило, разные версии имеют. Посмотрите по проекту .jar или .aar файлы, начинающиеся на support-v4 или support-v7. Нужно удалить дубликаты. P.S. вы, смотрю, используете Appodeal, UnityAds и т.п. Лучше используйте какой-нибудь агрегатор для рекламных сетей. Мы используем ironSource. Вам на клиенте всего один раз код написать надо будет, а рекламные сети потом в админке на сайте можно будет менять (ну и .jar адаптеров докидывать по необходимости).

Сколько всего способов создать объект в java?

#jvm #java

                    
Сколько всего существует способов создать объект в java ?
Я знаю два, с new и без него. Есть ли еще способы? 

Где java использует реализацию без new, кроме сериализации?
    


Ответы

Ответ 1



Примерно такие: public static void main(String[] args) { Test test = new Test(); Class testClass = Class.forName("Test"); Test test1 = testClass.newInstance(); EnumTest enumTest = EnumTest.ONE; } class Test{} enum EnumTest{ONE;}

Преобразование ломаной линии

#cpp #алгоритм #геометрия #2d

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



Также мне дана ломаная монотонная линия (обозначена синим цветом на рисунке), из
которой необходимо получить ломаную линию, проходящую через узлы сетки (обозначено
красной линией на рисунке).

Количество точек ломаной линии не совпадает с количеством точек результирующей ломаной.

Есть ли у кого-нибудь идеи по решению данной задачи?
    


Ответы

Ответ 1



Алгоритм: Выбираем клетки, через которые проходит ломаная. Циклично проверяем выбранные клетки: 2.1 Берем на границах клетки две точки, в которых ломаная пересекает эту клетку (или одну из крайних точек ломаной) и соединяем отрезком. 2.2 Сдвигаем отрезок так, чтоб обе точки находились на границах клетки (в случае с крайними точками ломаной). 2.3 Считаем углы между отрезком и границами к летки, к которым прилегает отрезок (достаточно неточного расчета в три варианта >45|=45|<45). 2.4 "основная" граница будет та, у которой угол <45 (обведено красным). Если угол =45, то обе границы равнозначны. Повторяем для всех клеток На основе полученных выборок по две границы строим ломаную Может получиться, что ломаная пройдет "вдоль" нескольких клеток, в этом случаем сравниваем результаты проверки текущей клетки и предыдущей. Если сторона клетки с минимальным углом одинаковая в обоих клетках, то вторую сторону не учитываем.

Ответ 2



Проведите дополнительные воображаемые вертикальные и горизонтальные линии посередине каждого столбца и строки. У вас получится вдвое более плотная сетка. Каждый узел исходной сетки окажется заключен в ячейку новой сетки. Если синяя линия проходит через этот прямоугольник, значит, она задействует соответствующий узел основной сетки. Каждый сегмент синей линии пересекается с одним или более полученных прямоугольников. Зная это, можно написать функцию, возвращающую по каждому сегменту массив узлов основной сетки, связанных с этими прямоугольниками. Обходя все сегменты синей линии мы получаем несколько таких массивов. Нужно их слить в один. Если последний узел в предыдущем массиве равен первому узлу в последующем массиве, записывать этот узел в результирующий массив всего один раз.

Ответ 3



#include #include #include using namespace std; int main() { // вообше то с такими задачами хранить лучше в std::valarray // допустим количество узловых точек = 4 * 4 и для примера приведу //конкретные цифры // в задаче же уже заданы эти цифры, я лишь для демонстрации идеи const int n = 4; valarray< int > matrix(n * n); // инициализируем первую строку снизу от нулевого индекса `n` штук valarray row{ 2, 4, 7, 8 }; // теперь учитываем что разница между соответствующим элементами // следующей строки должны быть одинаковыми. // и допустим эти цифры заданы в векторе vector dif{ 3, 2, 4 }; // инициализируем последовательность по срезам for (int i = 0; i < n; ++i) { matrix[slice(i * n, n, 1)] = row; if (i == n - 1) break; row += dif[i]; } // точки на кривой лучше хранить в map, так как кривая монотонно растет map curve{{ 3.4, 2.7 }, {4.1, 6}, {5, 9.3}}; // для первой точки на кривой auto para = curve.begin(); // теперь берем ближайшие целые этих точек int x = lround(para->first), y = lround(para->second); //... return 0;} теперь чтобы знать к каким элементам нашей последовательности ближе точка с координатами (x, y) всего лишь дело техники... для сравнения y наверняка понадобится dif, а STL альгоритмы дадут нам возможность рассмотреть любое количество точек с соответствующими предикатами. Вообшем идея такая, дальше подумайте сами

Ответ 4



0) Учащаем точки ломаной: в цикле определяем расстояние между соседними точками (D) у ломаной, если это расстояние больше, чем расстояние диагонали ячейки сетки (d), то вставляем дополнительною точку. Это шаг предобработки ломаной. В конце объясню зачем это нужно 1) Определяем ближайший узел (curr_node) к начальной точке (p) исходной ломаной Далее в цикле: 2) Определяем соседние узлы для curr_node (соседями не считать предыдущий посещенный узел) 3) Определяем расстояние от curr_node и от его соседних узлов до следующей точки ломаной (p_next). 4) Если расстояние от curr_node до p_next меньше, чем минимальное расстояние от его соседей до p_next, то p_next станет следующей точкой ломаной, иначе "посещаю" следующий узел сетки (тот соседний узел, который ближе всего к точке p_next) Далее возвращаемся к шагу 2 В итоге получаем такую картину посещения узлов т.е. собирая посещенные узлы (черные), получаем такую ломаную, проходящую по узлам сетки: А теперь покажу зачем нужно было делать нулевой шаг: Как видно из этих двух рисунков, первый вариант неверный. Вставкой дополнительных точек, добьемся правильного результата

Как обновить autowired коллекцию Spring

#java #spring

                    
Имеется коллекция объектов

@Autowired
private List objects;


В рантайме создаю новую реализацию интерфейса SomeInterface, 
Как сделать , чтобы спринг обновил эту коллекцию? 
    


Ответы

Ответ 1



Можете сделать так: @Autowired private ApplicationContext context; public Collection getList(){ return context.getBeansOfType(SomeInterface.class); } Но, чтобы это правильно работало, необходимо вашу новую реализацию зарегистрировать в контексте spring'a . Например так: ((DefaultListableBeanFactory)context .getAutowiredCapableBeanFactory()) .registerSingleton(new SomeInterfaceImpl());

JQuery timer не могу запустить вперед

#jquery

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

var _Seconds = $('.timer').text(),
  int;
int = setInterval(function() {
  if (_Seconds > 0) {
    _Seconds++;
    $('.timer').text(_Seconds);
  }
}, 1000);

        23 000 000+ `

    


Ответы

Ответ 1



Потому что $('.timer').text() возвращает строку, а строка "23 000 000+" непреобразуема в число. var _Seconds = +$('.timer').text(), int; int = setInterval(function() { if (_Seconds > 0) { _Seconds++; $('.timer').text(_Seconds.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ") + "+"); } }, 1000); 23000000 var _Seconds = +$('.timer').text(); function go() { if (_Seconds > 0) { _Seconds++; $('.timer').text(_Seconds.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ") + "+"); } var millisec = Math.ceil(Math.random()*10) * 500; console.log("time in seconds: ", millisec/1000); setTimeout(go, millisec); } go(); 23000000

Можно ли определить высоту контента элемента, если контент просто текст?

#javascript #dom

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

Вариант первый...



var textTwo = document.getElementById('text_two');
var textTwoChildren = textTwo.children;
var parHeight = 0;
for (var i = 0; i < textTwoChildren.length; i++) {
  parHeight += textTwoChildren[i].getBoundingClientRect().height;
}
console.log('parHeight -- ', parHeight)
#text_two {
  overflow: hidden;
  position: absolute;
  top: 0;
  left: 0;
  width: 300px;
  height: 100px
}

p {
  background: orange;
}

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Expedita alias, obcaecati voluptatum. Dolorum illo id dolore optio fugiat autem a!QQQQ

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quas accusantium eligendi magnam voluptatum officiis explicabo iste quod, eos possQQQQimus quo.

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Similique, aliquam vero incidunt? Architecto aspernatur obcaecati esse commodi QQQQatque. Quidem, maxime.

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor accusamus facere, animi, maiores numquam magni eveniet quam. DelectusQQQQ, dolor, optio!

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque reprehenderit commodi deserunt sapiente magni perferendis explicabo maiores QQQQofficiis doloribus repellat.

И как мы видим из этого первого примера, контентом блока text_two являются элементы, мы можем узнать их высоту... А вот во втором примере у нас просто контентом является текст var textTwo = document.getElementById('text_two'); var textTwoChildren = textTwo.children; var parHeight = 0; for (var i = 0; i < textTwoChildren.length; i++) { parHeight += textTwoChildren[i].getBoundingClientRect().height; } console.log('parHeight -- ', parHeight) #text_two { overflow: hidden; position: absolute; top: 0; left: 0; width: 300px; height: 100px }
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quia eaque odit autem sint aspernatur doloribus natus recusandae. Sequi praesentium officiis at fuga doloremque error aperiam vero accusamus optio assumenda quaerat similique perferendis vel, rerum quasi beatae officia ad nemo sint suscipit dolorum, sunt rem. Quidem eos illo et laborum quasi nihil
А что если, контентом блока text_two обычный текст, мы можем узнать высоту текста (контента)? P.S. Я в курсе, что могу этот текст сунуть в тег p и определить высоту параграфа


Ответы

Ответ 1



Можно проверять scrollHeight const textTwoElement = document.querySelector('#text_two'); console.log(textTwoElement.scrollHeight) #text_two { overflow: hidden; position: absolute; top: 0; left: 0; width: 300px; height: 100px }
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quia eaque odit autem sint aspernatur doloribus natus recusandae. Sequi praesentium officiis at fuga doloremque error aperiam vero accusamus optio assumenda quaerat similique perferendis vel, rerum quasi beatae officia ad nemo sint suscipit dolorum, sunt rem. Quidem eos illo et laborum quasi nihil


Почему после публикации android приложения его нельзя найти в поиске google play?

#android #google_play

                    
Написал приложуху (первую), в статусе - "опубликовано", уже два дня висит. Но вбиваю
название приложения - не находит. Если по ссылке зайти, то все норм. На форумах пишут,
что процедура индексации идет у кого-то 2 часа, у кого-то два дня. У меня прошло 3
дня! Почему так?
    


Ответы

Ответ 1



Доступность и параметры видимости приложений Мы понимаем ваше беспокойство относительно доступности приложения в Google Play. Чтобы все пользователи могли найти и скачать приложение, необходимо опубликовать его рабочую версию. Если текущей является альфа- или бета-версия, создайте рабочую. Напоминаем, что изменения, внесенные в Play Console, обычно появляются в Google Play через несколько часов. Если спустя 24 часа ваше приложение все ещё не отображается в Google Play, выберите один из предложенных ниже вариантов. ... Я не могу найти приложение по названию ... В Google Play приложения можно искать по названию, разработчику и описанию. Если в названиях брендов или приложений используются общие слова, это может затруднить работу поисковой системы при уточнении результатов поиска. Обратите внимание, что мы постоянно улучшаем алгоритм присвоения рейтинга приложениям. При этом неизбежно изменяются результаты по некоторым запросам. Мы внимательно отслеживаем запросы, чтобы предоставлять пользователям наиболее точные результаты. На отображение приложения в результатах поиска в Google Play Маркете влияет целый ряд факторов. Ниже описаны параметры, на основе которых производится фильтрация. Важную роль в этом процессе играют файл манифеста и особенности устройства. Также фильтрация выполняется на основе страны, мобильного оператора, наличия или отсутствия SIM-карты и других факторов. Например, если в манифесте приложения требуются функции телефона, оно не будет отображаться в Google Play на устройствах без соответствующего модуля, то есть на большинстве планшетных ПК. То же касается уровней API: если для работы приложения требуется уровень API не ниже седьмого, оно не будет отображаться на устройствах с уровнем API 6 или ниже. Кроме того, платные приложения доступны только пользователям из этих стран. Чтобы найти свое приложение в Google Play Маркете, укажите прямой URL в одном из следующих форматов: https://play.google.com/store/apps/details?id=имя_пакета https://play.google.com/store/apps/details?id=com.имя_домена.имя_приложения

Разница между присваиванием значения автосвойству и приватному полю со свойством

#c_sharp

                    
Добрый день, столкнулся с с таким вопросом, имеется автосвойство с методом доступа get

public string Name {get;}


С помощью конструктора я присваиваю ему значение

public MyClass()
{
  Name = "Max";
}


Автосвойство успешно принимает значение, в другом случае я явно указываю приватное
поле и свойство с методом доступа get

private string name;
public string Name; { get { return name;} }


Так же присваиваю значение с помощью конструктора

public MyClass()
{
  Name = "Max";
}


И в данном случае я получаю ошибку 

Error   CS0200  Property or indexer 'MyClass.Name' cannot be assigned to -- it is
read only


Насколько мне известно, при использовании автосвойства приватное поле создаётся неявно,
почему тогда не возникает такая же ошибка?
    


Ответы

Ответ 1



До недавнего времени возникала. Это разрешили в шестой версии C# и код в итоге раскрывается в следующий class MyClass{ private string name; public string Name { get { return name;} } public MyClass() { name= "Max"; } } Отсюда видно, что в конструкторе присваивается внутреннее поле, а не идет вызов самого свойства.

Как хранить смайлики в MySQL?

#mysql #python #python_3x #mysqlconnector #pymysql

                    
При попытке загрузить смайлик в БД, пишет: "1366 (HY000): Incorrect string value:
'\xF0\x9F\x98\x89' for column 'last_name' at row 1"

Нашел вариант про utf8mb4. Перевел сервер,БД,таблицы и поля в utf8mb4, все равно ошибка.

Если в Python при соед. указываю charset = utf8mb4, то получаю ошибку: "1273 (HY000):
Unknown collation: 'utf8mb4_0900_ai_ci'".

Нашел единственный вариант, который сработал это в Python указать: 

cursor.execute('SET NAMES utf8mb4')
cursor.execute("SET CHARACTER SET utf8mb4")
cursor.execute("SET character_set_connection=utf8mb4")


Тогда всё работает. Но тут неудобно везде писать эти три строки, возможно ли их как-то
прописать в настройках mysql?

Уже на самом деле запутался...
P.S.
Версия сервера: 5.7.21-0ubuntu0.16.04.1 
    


Ответы

Ответ 1



Оказалось, что... Python3 mysql.connector версии 8.0.6 не поддерживает utf8mb4. Переустановил на » mysql.connector.version '2.1.7' - работает.

setTimeout не работает если покинуть вкладку

#javascript

                    
Нажимаю кнопку сохранить. Вызывается setTimeout с задержкой 1500. 

Далее сразу покидаю вкладку, однако данные не обновляются, так как setTimeout не
отработал. Хотя предполагается что он должен сохранить данные с некоторой задержкой. 
Можно ли как то гарантировать выполнение некоторых данных с задержкой даже при переключении
на другую вкладку?
    


Ответы

Ответ 1



Вместо setTimeout я предлагаю вам использовать requestAnimationFrame. В примере кода ниже, когда вы запустите анимацию и переключите вкладку, а затем вернетесь обратно, вы увидите, что не смотря на смену вкладки, анимация продолжалась дальше. Таким образом, вы можете использовать requestAnimationFrame вместо setTimeout (причем использовать можно не только для анимации). Подробнее почитайте тут и тут. var div = document.querySelector('div'); var start = 100; function step(timestamp) { var progress = timestamp - start; a = Math.min(progress/10, 20000) + "px"; div.style.left = a if (progress < 20000) { requestAnimationFrame(step); } } requestAnimationFrame(step) div { position: absolute; }
test


Парсинг XSD С++

#cpp #qt #xml #xsd

                    
Привет всем. Возникла задача, на основе XML и XSD динамически подгружать интерфейс.
Написал xml и xsd файл к этой xml. Загружаю xsd файл в память, проверяю по xsd схеме
xml файл,с помощью библиотеки libxml2, выводит все хорошо или есть где нибудь ошибка,
но к примеру допустим все хорошо. Следующим этапом провожу парсинг xml файла средствами
Qt (QXmlReader), создаю необходимые формы. Теперь необходимо, как то достать из xsd
схемы значения ограничения диапазона, типы и другие атрибуты. К примеру в xsd схеме
хранится диапазон для формы, пример маленького кусочка большого файла привел ниже:


 
  
     
     
  
 



Вот мне нужно из определённого элемента в XSD достать: 
1) тип integer
2) minInclusive(мин значение диапазона) - 0
3) maxInclusive(максимальное значение диапазона) - 120

На основе этих значение для формы к примеру spinBox будут заданы ограничения 1) если
получили тип integer в результате парсинга xsd, будет создан объект класса QIntValidate
(для делегата) и будет установлен setRange(0,120); для этого spinBox

Возможно есть ли какие нибудь библиотеки для парсинга самой XSD, а не только XML?
Может кто то покажет пример xsd в libxml2, но я не нашел. Возможно кто то знает хорошие
примеры, как это можно сделать или делал это когда-нибудь средствами Qt. 
    


Ответы

Ответ 1



Схема XSD - это тоже файл в формате XML. Вы знаете его структуру. Можете тем-же парсером его парсить. Например, ищете узел с тэгом "xs:element" и со свойством "name" равному "age". В нём - узел с тэгом "xs:simpleType". В нём узел с тегом "xs:restriction". В нем в узлах с тегами "xs:minInclusive" и "xs:maxInclusive" берёте из свойства "value" необходимые вам значения ограничений.

Ответ 2



Посмотрите "CodeSynthesis XSD", может подойдёт. Есть более мощный продукт Altova XSD Editor (коммерческий), тоже c++ умеет генерить

Создание акта в word C#

#c_sharp #winforms #ms_word #office_interop

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

    


Ответы

Ответ 1



Используй стандартное расширение Microsoft.Office.Interop.Word и подготовь шаблон с данного документа с закладками в требуемых местах. Краткий код работы с документом: Word._Document document; Word._Application application=new Word.Application(); object missingObj = Missing.Value; object templatePathObj = documentpath; //открытие файла try { document = application.Documents.Add(ref templatePathObj, ref missingObj, ref missingObj, ref missingObj); } catch { document.Close(ref falseobj, ref missingObj, ref missingObj); application.Quit(ref missingObj, ref missingObj, ref missingObj); document = null; application = null; } //заполнение закладок object bookmarkObj = "закладка"; Word.Range bookmarkRange = document.Bookmarks.get_Item(ref bookmarkObj).Range; bookmarkRange.Text = ""; //работа с таблицей Word.Table _table = _document.Tables[tableNumber]; //Выбрать уже существующую таблицу внутри документа можно по ее порядковому номеру (начиная с 1 и начала документа) _table.Rows.Add(ref _missingObj); Word.Range _currentRange = _table.Cell(rowIndex, columnIndex).Range; _currentRange.Text=""; //Вывод на печать document.PrintOut(ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj); document.Close(Word.WdSaveOptions.wdDoNotSaveChanges); application.Quit(); Подробно об этом расширении есть тут и тут.

28.02.2018 перестала работать функция “Вставить результат вычисления формулы как значения”

#google_spreadsheet #google_apps_script

                    
Именно сегодня перестала работать функция - вставить результат вычисления формулы
как значения. (В Google Apps Scripts, Google Spreadsheets). На сейчас эта функция работает
как clearContents() - просто затирает все значения.

Пример:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getActiveSheet()
  var range = sheet.getRange("A1:C3")
  range.setFormula("=1+2")

  range.copyTo(range, {contentsOnly:true})
  //Или так:
  //range.copyValuesToRange(sheet, range.getColumn(), range.getLastColumn(), range.getRow(),
range.getRowIndex())
  //range.copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
}


Можно использовать другие методы, поколдовав с форматами, но почему же перестало
работать??

range.setValue(range.getValues())
range.setValue(range.getDisplayValues())

    


Ответы

Ответ 1



Вдруг кому интересно будет не смотря на минусовой вопрос: Необходимо добавить перед range.copyTo(range, {contentsOnly:true}) SpreadsheetApp.flush() Согласно документации, этот метод применяет все ожидающие изменения в таблице Applies all pending Spreadsheet changes. То есть, как я понимаю, ранее, при вызове copyTo, google перед тем, как брать данные из ячеек, сам применял все изменения (высчитывал результаты формул), а после этого уже делал копирование. Сейчас же нужно этот момент задавать вручную. UPD1: Согласно комментарию oshliaer, можно и Sheets API использовать. Насколько я понимаю, код будет где-то такой: // ss = SpreadsheetApp.getActiveSpreadsheet() // sheet = ss.getSheetByName("NAME") //Для примера: range = sheet.getRange("A1:C") function killAllFormulas2(ss, sheet, range) { // Обязателен вызов flush(), иначе если вы только вставили сложные формулы и сразу захотели вставить результаты вычисления как значения - они могут не успеть обновить данные в ячейках SpreadsheetApp.flush() // Получаем ID вашего Spreadsheet var ssID = ss.getId() // Если выбран такой диапазон как в примере - его обязательно нужно перевести в вид A1:C1000 (условно) var rangeA1 = sheet.getRange(range.getRow(), range.getColumn(), range.getLastRow()-range.getRow()+1, range.getLastColumn()-range.getColumn()+1).getA1Notation() // Получаем значения var values = Sheets.Spreadsheets.Values.get(ssID, sheet.getName() + "!" + rangeA1) // Вставляем значения Sheets.Spreadsheets.Values.update(values, ssID, sheet.getName() + "!" + rangeA1, {valueInputOption:"USER_ENTERED"}) } В примерах, которые встречаются вот здесь указано, что для большинства случаев использования лучше использовать стандартные методы встроенного SpreadsheetApp (например цитата для записи данных: This code uses the Sheets Advanced Service, but for most use cases the built-in method SpreadsheetApp.getActiveSpreadsheet().getRange(range).getValues(values) is more appropriate. По скорости работы я проверял на некоторых диапазонах со сложными формулами - разницы вообще не увидел. Скорее всего это все один и тот же алгоритм. Надеюсь, этот ответ поможет кому-то не тратить драгоценное время на поиски истины.

Преобразовать массив строк из статического в динамический

#c #строки

                    
нашел код

char string[]=  "abc/qwe/jkh";
char *array[10];
int i=0;

array[i] = strtok(string,"/");

while(array[i]!=NULL)
{
   array[++i] = strtok(NULL,"/");
}


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

#include 
#include 

char *string = "Value1,123,Value2,456,Value3,789,"; // запятая в конце необходима
char **array_of_strings = NULL; // указатель на указатель строк
int i = 0;
long comma_counter = 0;
int eachLine = 0;

// считаем количество запятых, чтобы понять сколько нам нужно памяти

for (i = 0; i < strlen(string); i++) {
    if (string[i] == ',') {
        comma_counter++;
    }
}
printf("Commas counted: %d\n", (int)comma_counter);

array_of_strings = malloc(comma_counter * sizeof(char*)); // выделяем столько сколько
насчитали 

if (array_of_strings == NULL) {
    printf("Memory allocation failed!");
    exit(1);
}


И вот первая проблема. strok возвращает указатель, и мне его нужно записать в array_of_strings
позиция 0.

Как записать строку в array_of_strings[0]?

---> = strtok(string, ",");
--->printf("%s\n", array_of_strings[eachLine]);

--->while(*array_of_strings) // дальше надо делать снова вызов выделения памяти
--->{
--->    array_of_strings = malloc();
--->    array_of_strings[++i] = strtok(NULL, ",");
--->    array_of_strings++;
--->}


// ну а это будущий вывод строк на экран
for (i = 0; i < comma_counter; i++) {
    printf("%s\n", array_of_strings[i]);
}

    


Ответы

Ответ 1



Пример разбивки строк есть здесь. Часто пользуюсь этим ресурсом. Что-то такое может быть: char string[] = "Value1,123,Value2,456,Value3,789,"; int comma_counter=6; char *pCh; char **array_of_strings=(char**)malloc(sizeof(pCh)*comma_counter); //переменная string изменится int k=0; char * pch= strtok(string, ","); while(pch!=NULL) { array_of_strings[k] = (char*)malloc(strlen(pch)*sizeof(char)+1); if (array_of_strings[k]==NULL) exit (1); strcpy(array_of_strings[k], pch); pch = strtok (NULL, ","); k++; if(k==comma_counter) pch=NULL; } printf ("%s \n %s", array_of_strings[0],array_of_strings[comma_counter-1]); //не забывайте освобождать память for(int i=0;i

Неверный подсчет при нажатии на чекбокс

#javascript #html

                    

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




function calculate() {
  var sum = 0;

$('select').each(function() {

sum += parseInt($(this).val());
});
var prinprice1 = 0;

//покраска по размерам взяли значения из текста селекта
  if ($("#yslygi").is(':checked'))

{if  (($('#shirina').val() == "0") || ($('#dlina').val() == "0") || ($('#visota').val()
== "0")) sum += 2500; prinprice1 += 2500;

  switch ($('#shirina option:selected').text())
  {
    case "900" : sum+=100; prinprice1+=100; break;
    case "1000": sum+=100; prinprice1+=100; break; 
    case "1100": sum+=200; prinprice1+=200; break; 
    }
   switch ($('#dlina option:selected').text())
  {
    case "1900" : sum+=100; prinprice1+=100; break;
    case "2000" : sum+=200; prinprice1+=200; break; 
    case "2100" : sum+=200; prinprice1+=200; break; 
 }
  switch ($('#visota option:selected').text())
  {
    case "1600" : sum+=100; prinprice1+=100; break;
    case "1700" : sum+=200; prinprice1+=200; break; 
    case "1800" : sum+=200; prinprice1+=200; break; 
 }

//вывод на чекбокс покраска
  $('#price1').html(prinprice1); 
} 

//итоговая цена
  $('#final_price').html(sum);

}

$('select,input').change(function() {
  calculate();
});


Заказать кровать чердак

Основные параметры