Страницы

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

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

Будет ли копироваться значение при передаче умных указателей в функцию или будет передаваться ссылка?

#cpp #указатели


Например, имеется некоторый класс:

class CSomeClass
{
    double GetLengthLine(std::shared_ptr firstVertex, std::shared_ptr
secondVertex) const;
}




double CTriangle::GetLengthLine(std::shared_ptr firstVertex, std::shared_ptr
secondVertex) const
{
    ....
    return std::hypot(dx, dy);
};


Будет ли копироваться значение при передаче умных указателей в функцию, или будет
передаваться ссылка?
    


Ответы

Ответ 1



Если я правильно понял вопрос (хотя на этот счет есть сомнение, т.к. уже имеется принятый ответ), то речь всё же о копировании объекта типа CPoint, которым параметризован std::shared_ptr. В этом случае совершенно не важно как будет передаваться объект умного указателя по ссылке или по значению - это не приведет к дополнительному копированию объекта, хранимого в указателе. Пример: #include #include struct S { S() { std::cout << "ctor\n"; } S(const S&) { std::cout << "copy\n"; } S(S&&) { std::cout << "move\n"; } }; void f(std::shared_ptr) {} void g(const std::shared_ptr&) {} int main(){ auto s = std::make_shared(); f(s); g(s); } Вывод: ctor Т.е. был создан только один объект. Ни копирований, ни перемещений не произошло. Это в принципе логично, т.к. подобным же образом не происходит создания (полезных) объектов при передаче обычных (не умных) указателей. В общем случае, любой достаточно большой (более нескольких sizeof(int)) объект имеет смысл передавать по константной ссылке, если не предполагается его модифицировать.

Ответ 2



Так как параметры ваших функций принимают объект типа std::shared_ptr по значению, то в функции будут передаваться копии аргументов, с которыми они вызваны. То есть соответствующий аргумент либо будет перемещаться, либо копироваться в параметр функции, так как класс std::shared_ptr имеет как конструктор копирования, так и конструктор перемещения. Но будет меняться число ссылок на тот указатель, который обернут в std::shared_ptr. То есть при вызове функций будет меняться счетчик ссылок на исходный "сырой" указатель. Рассмотрите следующую демонстрационную программу. #include #include void f( std::shared_ptr p ) { std::cout << "Inside f() shared_ptr::use_count() = " << p.use_count() << std::endl; } int main() { std::shared_ptr p( new int ( 10 ) ); std::cout << "Before calling f shared_ptr::use_count() = " << p.use_count() << std::endl; f( p ); std::cout << "Aftera calling f shared_ptr::use_count() = " << p.use_count() << std::endl; return 0; } Ее вывод на консоль следующий Before calling f shared_ptr::use_count() = 1 Inside f() shared_ptr::use_count() = 2 After calling f shared_ptr::use_count() = 1

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

#c_sharp


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

Запуск приложения ->
Указываем строковое значение ->
Работа приложения ->
Получаем строковое значение

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

Вопросы:


можно ли это сделать в консольном приложении?
если да то как принимать и как отправлять значения?
другой вариант?

    


Ответы

Ответ 1



В других ответах уже написали про параметры командной строки и код возврата. Но, как мне кажется, вам больше подойдут стандартные потоки ввода-вывода и их перенаправление. Например, напишем такую простейшую консольную программку: using System; class Program { static void Main() { // Читаем из стандартного потока ввода string line = Console.ReadLine(); // Обрабатываем введенное значение line = line.ToUpper(); // Пишем в стандартный поток вывода Console.WriteLine(line); } } Кстати, можно явно писать Console.In.ReadLine() и Console.Out.WriteLine(), указывая потоки ввода и вывода. Если её запустить, то нужно будет ввести строку в консоли. Результат тоже появится в консольном окне. Теперь можно использовать перенаправление потоков. Например, подадим на вход нашей программе текстовый файл, из которого она прочтёт значение (одну первую строку). Вывод перенаправим в другой текстовый файл. app < in.txt > out.txt Где app.exe - имя нашей программы. in.txt - входной файл. out.txt - выходной файл. Про конвейер и поток ошибок почитаете сами.

Ответ 2



Отвечаю на вопрос, как его понял я :) Вероятно, вы хотите, чтобы ваше консольное приложение запускалось с некими параметрами (ping localhost, где localhost - параметр) Создайте консольный проект, посмотрите на заголовок главного метода: static void Main(string[] args) Массив args - это и есть входные параметры. Если сделать так: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { if (args[0] == "print") Console.WriteLine(args[1]); } } } А потом скомпилировать, и в командной строке набрать ConsoleApplication1 print hello - в консоль выведется hello Дальше сами :)

Ответ 3



В ответе выше вам дали код, даже два раза (повторять его не буду), как принимать параметры командной строки и обрабатывать их в консольном приложении. Суть сводится к тому, что вы вызываете свое приложение, и в строке вызова передаете их приложению через строковый массив args. После того, как вы получили нужные параметры, в вашем примере - имя сайта, ваше приложение выполняет необходимые действия и завершает работу. При завершении работы можно указать целочисленный (int) код возврата, он же ExitCode, который может быть обработан в вызывающем приложении. Т.е. true или false как вы хотите, возвратить не получится, а вот 0 или 1 (или еще какое число типа int) — запросто. Возвращать можно переопределив метод Main() в консольном приложении, заменив void на int, например так: static int Main(string[] args) { int i = 0; Console.WriteLine("Hello! I'll try to write command-line arguments."); foreach (var parameter in args) { Console.WriteLine("Parameter " + i.ToString() + " is: "+args[i]); } Console.WriteLine("Press ENTER to exit"); Console.ReadLine(); return args.Count(); } В данном коде программа может получать на вход какие-то аргументы командной строки, и пытается вывести их на экран консоли, после чего завершает работу с кодом возврата, равным числу аргументов. Кроме этого, получить тот же результат (завершение приложения с кодом возврата) можно при помощи метода Environment.Exit(code) (MSDN), которое позволит завершить работу не только по окончанию метода Main(), но и из другого места в программе. Можете попробовать вместо return args.Count(); написать так: Environment.Exit(args.Count()); (только верните назад void вместо int). Немного модифицированным и более гибким вариантом для решения вашей задачи будет использовать некий буфер (или буферы) для обмена данными, например, файлы: запускаем программу и в качестве аргумента командной строки передаете ей имя файла с какими-то входными данными, и имя файла, куда будет выведен результат. Программа обрабатывает входные данные, с их учётом выполняет какие-то действия, а результат записывает в нужном виде в выходной файл, который потом можно обработать как вам захочется. Для работы с файлами в арсенале C# есть разные инструменты, и рассказывать о всех возможностях как записать/прочитать файл слишком долго и много, но почитать об этом можно, например, тут, или тут, или здесь. Или погуглить и найти еще источники )

Поддержка уникальности строк в QStringLiteral

#cpp #qt #qt5


Из справки известно, что QStringLiteral размещает текст непосредственно в исполняемом
файле в области только для чтения. Однако я не нашёл информации о том, что в случае
использования одинаковых строк в разных местах кода проекта, эти строки будут храниться
по уникальности значения. Или каждый экземпляр строки будет сохранён отдельно?

Допустим, имеется сетевой запрос к некоему внешнему ресурсу. Этот запрос имеет строковую
команду, скажем, "https://ru.stackoverflow.com/". Также есть два класса: class A и
class B. В обоих требуется выполнять указанный запрос:

class A {
    void getSo() {
        sendRequest(QStringLiteral("https://ru.stackoverflow.com/"));
        // Далее выполняем что-то специфическое для класса A.
    }
};

class B {
    void getSo() {
        sendRequest(QStringLiteral("https://ru.stackoverflow.com/"));
        // Далее выполняем что-то специфическое для класса B.
    }
};


Вопрос заключается в том, что именно попадёт в исполняемый файл: две строки с адресом
запроса или одна? Или я неверно понимаю принцип работы указанного макроса?
    


Ответы

Ответ 1



Стандартом не оговорено. Зависит от компилятора и настроек. Например, в Visual C++ 2015 имеется опция (зависящая от использованных параметров оптимизации) /GF включить объединение строк только для чтения Так что эти литералы будут объединены. Но если скомпилировать без этого ключа или с с /GF-, то в exe'шнике каждая займет свое место (при отключенной оптимизации - включение оптимизации автоматически включает эту опцию).

Конвертировать текст на русском из pdf в txt python

#python #pdf


Пытаюсь конвертировать кирилицу из pdf в txt c помощью PyPDF2 в Python:

import PyPDF2
pdf_file = open('mail_cir.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print (page_content.encode('utf-8'))


Ошибки не выдает, но и текст не видит.

Пыталась изменить:

 pdf_file = codecs.open('mail_cir.pdf', 'rb', encoding='utf-8')


Тогда выдается ошибка: 


  TypeError: Can't convert 'bytes' object to str implicitly


И другой вопрос:

Если конвертировать стих, то после окончания строки на пустом месте выводится \n
\n. Как избавиться от этих символов?
    


Ответы

Ответ 1



Можно воспользоваться PDFMiner, чтобы текст, включающий русские буквы, из pdf достать: #!/usr/bin/env python import sys import pdfminer.high_level # $ pip install pdfminer.six with open('mail_cir.pdf', 'rb') as file: pdfminer.high_level.extract_text_to_fp(file, sys.stdout) pdf2txt.py показывает как эта функция может быть использована—можно много опций передать. Ввод (в pdf) English 🇬🇧 На русском 🇷🇺 Smiley: ☺ non-BMP smiley: 😂 Вывод (текст в консоли) English На русском Smiley: ☺non-BMP smiley: Русский текст нормально извлёкся, но non-BMP смайлик 😂 (U+1F602) и флаги 🇬🇧 (U+1F1EC U+1F1E7), 🇷🇺 (U+1F1F7 U+1F1FA) потерялись при конвертации. Код с PyPDF2, похожий на приведённый в вопросе, смог извлечь только символы в ASCII диапазоне.

JQuery. Поворот изображения туда-обратно

#jquery


Доброго времени суток! Не могу сообразить, как реализовать поворот картинки на 45
и -45 градусов непрерывано, то есть, картинка все время наклоняется то в одну, то в
другую сторону. Пока только при наведении мыши реализовано:  



  

    


Ответы

Ответ 1



Позволил себе чуть изменить код Abmin чтобы подходил по условию: #me { -webkit-animation: rotation 2s infinite linear; padding: 20px; } @-webkit-keyframes rotation { 0% { -webkit-transform: rotate(0deg); } 50% { -webkit-transform: rotate(90deg); } 100% { -webkit-transform: rotate(0deg); } }

Ответ 2



Сделал на CSS #me { -webkit-animation: rotation 2s infinite linear; padding: 20px; border-radius: 50%; } @-webkit-keyframes rotation { 0% {-webkit-transform: rotate(0deg);} 25% {-webkit-transform: rotate(45deg);} 50% {-webkit-transform: rotate(0deg);} 75% {-webkit-transform: rotate(-45deg);} 100% {-webkit-transform: rotate(0deg);} }

Получение кода символа

#c


int main(void)
{

  printf("%d",(int)'А');
}


По идее, программа должна вывести код 'А'(кириллица), т.е. 192, но почему-то выводит -64.
    


Ответы

Ответ 1



Тип char может вести себя либо как тип signed char либо как тип unsigned char в зависимости от установленных опций компилятора. В вашем случае тип char ведет себя как тип signed char. Для типа signed char максимальное положительное значение равно 127 или в шестнадцатиричной форме 0x7F. Если хотите получить положительное значения кода, то напишите printf("%d",(unsigned char)'А'); При этом русская буква не должна быть представлена как многобайтная константа.

Как сделать на CSS неполную обводку круга?

#css


Как на CSS сделать неполную обводку круга?

    


Ответы

Ответ 1



Вот так будет универсальнее - можно длину обводки настраивать по желанию: .pie { display: inline-block; margin: .5em; width: 8em; height: 8em; position: relative; border-radius: 50%; } .pie:after { border-radius: 50%; display: block; content: ""; background: #fff; position: absolute; left: .5em; top: .5em; height: 7em; width: 7em; } .p1 { background-image: linear-gradient(-30deg, #ddd 50%, transparent 50%), linear-gradient(90deg, #ddd 50%, steelblue 50%); } .p2 { background-image: linear-gradient(90deg, #ddd 50%, steelblue 50%); } .p3 { background-image: linear-gradient(150deg, transparent 50%, steelblue 50%), linear-gradient(90deg, #ddd 50%, steelblue 50%); } .p4 { background-image: linear-gradient(270deg, transparent 50%, steelblue 50%), linear-gradient(180deg, #ddd 50%, steelblue 50%); }


Ответ 2



Вот так ? * { margin: 0; } div { width: 300px; height: 300px; border: 10px solid red; border-right: 10px solid transparent; border-radius: 300px; margin: 20px auto; }


Почему алиас «cd» работает так странно?

#linux #bash


Хотел сделать алиас cd, который будет сразу перечислять директории.

Попробовал все следующие варианты:

alias 'cd'='cd $1; l'
alias 'cd'='cd $1; l $1'
alias 'cd'='cd $1 && l'
alias 'cd'='cd $1 && l $1'


Где, l (строчная «L») — алиас другого приложения (tree).


  Всегда перегружал терминал, чтобы наверняка, так как . ~/.bash_aliases у меня почему-то
не срабатывает.


Все вышеперечисленные алиасы при вводе cd / перечисляют список директорий / файлов
в точке монтирования /, однако смена директории не происходит.

Тогда я попробовал прописать в том же .bash_aliases функцию (оба варианта, по очереди):

cd() {
    cd $1
    l
}

function cd() {
    cd $1
    l
}


В итоге, при выполнении cd / команда «виснет» ...

Единственный способ, который я нашёл, это сделать так:

cdl() {
    cd $1
    l
}


То есть задать другое имя ... Но в тоже время, если вернуться к первому варианту алиаса:

alias 'cd'='cd $1; l'


Здесь же срабатывает cd при вводе cd /, так как l перечисляет список директорий / файлов
по пути /, так почему же тогда он возвращает обратно в домашнюю директорию?
    


Ответы

Ответ 1



псевдоним оболочки (shell alias) — это не функция и не программа. у псевдонима нет аргументов, его описание всего лишь подставляется в команду вместо его имени. поэтому, если вы определили, например, такой псевдоним: $ alias cd='cd $1; ls' то при вводе команды $ cd /tmp она преобразуется в $ cd ; ls /tmp обратите внимание на пустое место после cd — туда ничего не будет подставлено (вместо $1), т.к. переменная $1 не содержит никакого значения. в результате вашим текущим каталогом станет ваш домашний каталог (так действует внутренняя команда cd, если ей не передать никаких параметров), а затем будет выполнена команда ls /tmp. когда вы определяете функцию: $ function cd() { cd $1; ls; } команда cd $1 внутри её тела трактуется как рекурсивное обращение к этой же функции, вот и происходит «зависание». кстати, обратите внимание, что в теле псевдонима не происходит такой рекурсии — cd $1 там трактуется именно как обращение к внутренней команде оболочки cd. и напоследок, в виде факультативного дополнения к ответу на вопрос «почему», приведу пример того, как сделать, чтобы «работало так, как хочется»: $ function cd() { command cd "$@"; ls; } использовать надо именно функцию (кстати, само ключевое слово function в данном случае — опционально), чтобы получить и обработать список аргументов. для вызова внутренней команды оболочки надо использовать внутреннюю же команду command. правильнее передавать не только первый аргумент, а все аргументы ($@), а чтобы корректно обрабатывались спец-символы (например, пробелы/кавычки и т.п.) внутри аргументов, список лучше заключить в двойные кавычки ("$@").

Параллельный доступ Flask application

#python #flask


Имеется веб приложение, которое реализовано на Flask. Вопрос заключается в следующем. 
Идея такая - два разных пользователя загружают например списки товаров. После этого
пользователь А изменяет товар, и пользователь Б тоже изменяет этот же товар.
Система должна определить, Что товар был уже изменен и второй пользователь перезаписывает
информацию, внесенную первым. Это может выглядеть как сообщение пользователю Б в котором
написано что он перезаписывает.
Сама система работает с базой данных приложения, используя SQLAlchemy. 
Сам Flask по умолчанию обрабатывает запросы последовательно, поэтому вопрос, что
нужно сделать, чтобы реализовать посыл сообщения пользователю Б.
Уже день ищу в интернете, ничего интересного не вижу.
    


Ответы

Ответ 1



Оптимистическая блокировка спасёт отца русской демократии. Это самое простое решение, требующее незначительных доработок: Добавляете в модель поле, хранящее версию данных; Добавляете обработку исключения StaleDataError в обработчик сохраняющий товар; Добавляете шаблон с формой для разрешения конфликта.

Ответ 2



Обмен сообщениями в реальном времени или отправку сообщения пользователю о каком-то изменении можно реализовать с помощью SocketIO - https://github.com/miguelgrinberg/python-socketio Есть интеграция с Flask

Как дождаться выполнения функции?

#javascript #jquery #ajax


После java асинхронность в js это беда для меня.
Суть проблемы: написать функцию, которая проверяет наличие файла, если есть, то true,
нет - false. Казалось бы все просто, но не тут то было.

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

Теперь у меня код в if выполняется как false, не дожидаясь верного ответа от doesFileExist(urlToFile);
Подскажите пзл, как сюда можно прикрутить ноги? С $.when у меня не получается ничего (

    function doesFileExist(urlToFile) {
           $.ajax({
               url: urlToFile,
               type: 'HEAD',
               error: function () {
                   console.log(false)
                   return false;
               },
               success: function () {
                   console.log(true)
                   return true;
               }
           });
     }

  if(doesFileExist(url)){}


старый вариант

      function doesFileExist(urlToFile){
            var xhr = new XMLHttpRequest();
            xhr.open('HEAD', urlToFile, false);
            xhr.send();
            if (xhr.status == "404") {
                return false;
            } else {
                return true;
            }
        }

    


Ответы

Ответ 1



Старый вариант - синхронный код (главный поток будет «заморожен»* до получения результата). Новый вараинт - асинхронный. И функция doesFileExist после отправки асин. запроса будет возвращать undefined (так как когда мы ничего не возвращаем (то что в success и error, выполнится позже, после получения ответа), возвращается undefined) doesFileExist() { //async action setTimeout(function(){ return true; }, 0) // return undefined } console.log(doesFileExist()); // undefined Чтобы обработать полученный результат, нужно создать функции (в данном случае две), которые будут вызываться при получении ответа. var successCallback = function() { console.log(true); } var errorCallback = function() { console.log(false); } doesFileExist(url, successCallback, errorCallback); function doesFileExist(urlToFile, success, error) { $.ajax({ url: urlToFile, error: error, success: success }); }

Ответ 2



Добавьте 2 новых параметра в функцию doesFileExist, например, successCallback и failCallback. Вместо return true/false, выполняйте эти функции: successCallback()/failCallback(). И конечный вызов метода будет примерно такой: doesFileExist(url, function() { // файл существует }, function () { // файл отсуствует });

Порядок выполнения git commit и git pull

#git #git_commit #git_pull


Недавно начал работать с гитом.
Какая разница сделать pull до commit или после commit, и есть ли она вообще?
    


Ответы

Ответ 1



В целом разницы нет. Если конфликта в ваших изменениях и изменениях из upstream не будет, то все пройдет без вопросов. Если же возникнет конфликт слияния, git так или иначе сообшит об этом, и вам в любом случае придется его решать. Но я бы предпочел сначала сделать коммит, чтобы зафиксировать изменения. Тогда легко можно будет откатиться к исходной версии ваших изменений, если что-то пойдет не так. Если коммит по каким-то причинам делать не хочется (например, работа не завершена), можно временно спрятать изменения командой git stash, потом сделать git pull, а потом вернуть изменения командой git stash apply. Этому посвящен отдельный раздел в документации.

Перебор файлов и копирование в определенную папку

#c_sharp


Как вызвать метод List?

public static void SearchAllFiles()
{
    List files = new List();
    String[] extensions = new String[] { "*.jpg", "*.txt", "*.asp" };

    foreach (String extension in extensions)
    {
        String[] files = Directory.GetFiles(path, found, SearchOption.AllDirectories);

        foreach (String file in files)
            files.Add(file);
    }
}


И не могу сообразить в каком месте вставить копирование файлов:

 File.Copy(path, path + Path.GetFileName(path));

    


Ответы

Ответ 1



Для начала сделаем метод для поиска файлов по маске. Работает с .NET 4.0 и быстрее, чем Directory.GetFiles: public static IEnumerable nGetFiles(string path, string searchPatternExpression = "", SearchOption searchOption = SearchOption.AllDirectories) { Regex reSearchPattern = new Regex(searchPatternExpression); return Directory.EnumerateFiles(path, "*", searchOption).Where(file => reSearchPattern.IsMatch(Path.GetFileName(file))); } Теперь так: public static void SearchAllFiles() { //Искомые расширения: string LookForExt = "\.jpg|\.txt|\.asp"; //Пути папок источника и приёмника: string SourcePath = @"D:\SourceDir\"; string TargetPath = @"D:\TargetPath\"; //Получаем файлы и копируем их: IEnumerable files = nGetFiles(SourcePath, LookForExt); foreach (f in files) //Можно было и так: foreach (f in nGetFiles(@"D:\SourceDir", LookForExt)) { try { File.Copy(f, TargetPath + Path.GetFileName(f), true); } catch (Exception e) { throw e; } } } В результате будут просканированы все файлы в папке SourcePath и ее подпапках, найденные файлы, соответствующие искомым расширениям будут скопированы в TargetPath без сохранения структуры подпапок. Более того, если есть файл D:\SourceDir\test.asp и есть файл D:\SourceDir\111\test.asp, то в результирующей папке D:\TargetPath\ будет только один из этих файлов, который будет копироваться последним (он и перезатрёт существующий, и скопированный первым в целевую папку файл). Если же нужно скопировать файлы из папки с сохранением структуры вложенных папок и файлов, то вот тут уже давал ответ.

Ответ 2



Создаете массив с расширениями, в цикле пробегаетесь по нему и ищите файлы с нужным расширением, дальше пробегаетесь в цикле по всем найденным файлам одного расширения и копируете по одному в нужную директорию, в моем случае копирование из D:\files в D:\files\copied public static void SearchAllFiles() { string path = @"D:\files\"; // откуда string pathTo = @"D:\files\copied\"; // куда string[] extensions = { "*.jpg", "*.txt", "*.asp" }; foreach (string ext in extensions) { foreach (string file in Directory.GetFiles(path, ext, SearchOption.AllDirectories)) { File.Copy(path + Path.GetFileName(file), pathTo + Path.GetFileName(file)); } } }

Как правильно сделать проверку обновлений версии приложения?

#java #android


Есть такое приложение GetTaxi так вот когда есть доступное обновление, то при открытии
приложения появляется pop-up и сообщает юзеру о доступном обновлении.

Я знаю что play market тоже предлагает обновления, но ведь это все регулируется настройками
и можно отключить автоматическое обновление, нотификациию и все прочие.

Так вот я думаю сделать так, когда есть новый versionCode сохранять его значение
на сервере, а приложение каждый раз при запуске отправляет запрос на сервер и проверяет
совпадает ли цифра с цифрой на сервере, если нет то показываем pop up и прикрепляем ссылку

Вот такая идея)

Я не уверен что такое решение самое правильное поэтому интерисуюсь здесь

Спасибо 
    


Ответы

Ответ 1



Есть готовый библиотеки для такого(дофига). Просто поищи на гитхабе. Первая ссылка на гитхабе: https://github.com/rampo/UpdateChecker Нужно еще подключить апаче в градл так как с 23 версией появились изменения apply plugin: 'com.android.application' android { ... useLibrary 'org.apache.http.legacy' ... }

Ответ 2



Вполне нормальное решение. А всплывающий диалог сделать setCancelable(false) и по кнопке ок открывать плэй маркет. Только нужно убедиться, что плэймаркет уже опубликовал версию, иначе казус выйдет =)

Ответ 3



Вариант с проверкой новой версии приложения со своего сервера является довольно гибким, но в самом простом случае (когда версия приложения не зависит от устройства) наиболее рациональным решением я считаю проверку версии именно из Google Play. Получить текущую версию приложения из Google Play можно, например, так: private class GetNewVersionCodeTask extends AsyncTask { @Override protected String doInBackground(Void... params) { String newVersion; try { newVersion = Jsoup.connect("link_to_your_app_in_google_play") .timeout(30*1000) .userAgent("Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36") .referrer("https://www.google.ru") .get() .select("div[itemprop=softwareVersion]") .get(0) .text(); } catch (IOException e) { return null; } return newVersion; } @Override protected void onPostExecute(String newVersion) { super.onPostExecute(newVersion); if (newVersion != null) { Toast.makeText(getApplicationContext(), newVersion, Toast.LENGTH_SHORT).show(); } else { // some actions } } } Здесь для простоты реализована связка AsyncTask + Jsoup, но, разумеется, Вы можете воспользоваться средствами, которые наиболее привычны для Вас.

Почему не отображается карта гугл сайте

#javascript #jquery #google_maps_api


Почему не отображается карта гугл на сайте хотя на denwer все работает отлично 
    


Ответы

Ответ 1



Вы не указали API ключ при подключении API Про ключ можете узнать здесь: https://developers.google.com/maps/documentation/javascript/get-api-key

Узнать версию Runtime для сборки не загружая ее

#c_sharp


Мне нужно отобразить список всех сборок в GAC, а так же их RuntimeVersion.
Если делать так:

Assembly.ReflectionOnlyLoadFrom(systemAssemblyModel.Path).ImageRuntimeVersion;


то пямять забивается на лишние 80 мб и непонятно как их очистить. 
Если же загружать сборки полностью и затем выгружать ее вместе с доменом. То проиcходит
OutOfMemoryException:

internal class Program
{    
   static void Main(string[] args)
   {
       var appDomain = AppDomain.CreateDomain("TestDomain");    
       appDomain.DoCallBack(() => LoadModule());    
       var worker = (Worker) appDomain.CreateInstanceAndUnwrap(typeof (Worker).Assembly.FullName,
typeof (Worker).FullName);
       var a1 = worker.GetAssembliesFullName();

       foreach (var assemblyFullName1 in a1)
       {
           Console.WriteLine(assemblyFullName1);
       }
       Console.WriteLine();
       var a2 = AppDomain.CurrentDomain.GetAssemblies();
       foreach (var assembly1 in a2)
       {
           Console.WriteLine(assembly1.FullName);
       }
            AppDomain.Unload(appDomain);

       Console.ReadKey();
    }

    private static void LoadModule()
    {   
        foreach (var systemAssemblyModel in AssemblyLoader.LoadAssemblies())
        {
            try
            {
               var version = Assembly.Load(systemAssemblyModel.Desc.Path).ImageRuntimeVersion;
            }
            catch (Exception)
            {

            }
        }
     }    
}

class Worker : MarshalByRefObject
{
    public string[] GetAssembliesFullName()
    {
         return AppDomain.CurrentDomain.GetAssemblies().Select(a => a.FullName).ToArray();
    }
}

    


Ответы

Ответ 1



Может кому пригодится. По совету Вам поможет пакет Mono.Cecil – Pavel Mayorov Подключил библиотеку и использовал следующий код AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(assemblyDescription.Path); Console.WriteLine(assemblyDescription.Name + " " + assembly.MainModule.RuntimeVersion);

Ответ 2



У меня работает так без использования доп. библиотек, но получает только лишь версию вида 1.0.5.124: /// /// Без выполнения загрузки файла в память (актуально для сборок) возвращает версию файла Filename в переменную /// типа Version если файл существует и возможно получение номера версии. /// Если файл не существует — возвращает null. /// Если номер версии не удается получить для файла, то все поля результата будут нулевыми (0.0.0.0). /// Если имя файла не указано, то возвращает сведения для выполняемой сборки. /// /// путь к файлу для вычисления версии. /// Правильнее и надежнее использовать метод GetFileVersionInfo. public static Version GetFileVersion(string Filename = "") { if (string.IsNullOrEmpty(Filename)) { Filename = Assembly.GetExecutingAssembly().Location; } if (!File.Exists(Filename)) { return null; } Version version = new Version(); try { FileVersionInfo vi = FileVersionInfo.GetVersionInfo(Filename); version = new Version(vi.ProductVersion); } catch (ArgumentNullException) { //Не можем определить версию файла, и, перемнную для обработки ошибки не ловим, т.к. //её не обрабатываем, а делаем вид, что у файла нулевая версия. version = new Version(0, 0, 0, 0); } return version; } А вот простенький метод, возвращающий больше информации: /// /// Возвращает сведения о версии и параметрах файла в переменную класса FileVersionInfo без загрузки файла /// в память (не блокирует файл). /// Если файл не существует, то возвращает null. /// Если имя файла не указано, то возвращает сведения для выполняемой сборки. /// /// Имя файла для получения сведений о версии. /// /// Если получить версию файла невозможно (например, для файлов, отличных от EXE и DLL), то возвращает /// практически пустую структуру класса FileVersionInfo БЕЗ генерации ошибки. /// public static FileVersionInfo GetFileVersionInfo(string Filename = "") { if (string.IsNullOrEmpty(Filename)) { Filename = Assembly.GetExecutingAssembly().Location; } if (!File.Exists(Filename)) { return null; } return FileVersionInfo.GetVersionInfo(Filename); }

Как получить имя доменой учетной записи в MS SQL

#sql #sql_server


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


Ответы

Ответ 1



Ответ на ваш вопрос - нет. Штатными средствами - никак. Логика такая - сервер, это отдельная изолированная сущность, которая знать не знает ничего о том, кто и под каким именем работает на компьютере. Грубо говоря, для выполнения запросов нужно подключиться к серверу. После подключения вся работа с сервером выполняется от имени того пользователя, который был подключен к серверу. Сам сервер знает имя и пароль этого пользователя, и не более. Для того, что бы сервер смог вам выдать имя пользователя, который у вас залогинен в операционной системе, MS SQL должен уметь опрашивать на этот счет операционную систему. Но зачем это ему? Так что сервер не умеет опрашивать винду и узнавать какой пользователь там залогинен, ибо как это вообще относится к функциям сервера и базам данных? Никак. Но есть один момент, когда для подключению к серверу используется механизм аутентификации Windows. В этом случае система аутентификации Windows и MS-SQL взаимодействуют. В этом случае для авторизации на сервере используются учетные данные Windows. И только в этом случае имя пользователя в Windows и на MS SQL Server совпадают. Но вот уже дальнейшие распределения прав на объекты внутри сервера обеспечиваются самим сервером, вне зависимости от роли учетной записи Windows. Итого, получаем, что варианты у нас крайне ограничены: Подключаться к БД через windows-аутентификацию, тогда имя домена и учетной записи будет передано внутрь сервера. Но это не всегда возможно. Передавать серверу имя домена и пользователя из клиента самостоятельно (нужно подумать, каким именно способом). 2а. Можно попробовать заставлять сервер самостоятельно, каждый раз при подключении пользователя выполнять какой-то внешний инструмент (программу), которая получала бы имя пользователя Windows, подключалась к серверу, и записывала бы в отдельную таблицу имя виндового пользователя, который подключился к серверу. Но п. 2 и 2а сами по себе мне кажутся очень неудобными, громоздкимии кривыми костылями.

Ответ 2



Вы можете попытаться определить машину пользователя, с которой пришло подключение SELECT HOST_NAME() AS HostName и таким образом идентифицировать того, кто работает с БД на этой машине. Однако это не всегда будет работать, поскольку хост может определиться, как имя программы, типа "Microsoft Office" и т.п.

Как вывести содержимое текстового файла с пронумерованными строками?

#linux #shell


Помогите разобраться.

Выполняется поиск текстового файла с наименьшим количеством слов.

$ find -name "*txt" | xargs wc -w | sort -g | head -n 1


Как вывести на экран содержимое найденного текстового файла с пронумерованными строками?
cat -n?
    


Ответы

Ответ 1



варианты выдачи содержимого файла или потока с пронумерованными строками: nl содержимое указанного файла: $ nl файл содержимое потока строк: $ какие-то команды | nl cat содержимое указанного файла: $ cat -n файл содержимое потока строк: $ какие-то команды | cat -n less содержимое указанного файла: $ less -N файл содержимое потока строк: $ какие-то команды | less -N awk содержимое указанного файла: $ awk '{ print FNR " " $0 }' файл содержимое потока строк: $ какие-то команды | awk '{ print FNR " " $0 }' perl содержимое указанного файла: $ perl -pe '$_ = "$. $_"' файл содержимое потока строк: $ какие-то команды | perl -pe '$_ = "$. $_"' у вас, как я понял, весь поток заканчивается выдачей имени файла. чтобы применить к нему любую из перечисленных команд, надо воспользоваться программой xargs, которой вы уже пользовались. например, передать это имя программе nl можно так: $ команды возвращающие имя файла | xargs nl

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

#bash #shell #zsh


Представим, что есть некая программа, которая отдает данные вот в таком формате:

$ cat foo.bs
#!/bin/bash

echo "[INFO] Инициализация временных сдвигов"
sleep 1
echo "[INFO] Подготовка к временному увеличению скорости света"
sleep 1
echo "[WARN] u.speed_of_light: NaN"
sleep 1
echo "[INFO] Скорость света увеличена, начинаем создание темной материи"
sleep 1
echo "[ERROR] java.lang.NullPointerException: null"

$ ./foo.bs
[INFO] Инициализация временных сдвигов
[INFO] Подготовка к временному увеличению скорости света
[WARN] u.speed_of_light: NaN
[INFO] Скорость света увеличена, начинаем создание темной материи
[ERROR] java.lang.NullPointerException: null


Что хотелось бы получить:

[INFO] Подготовка к временному увеличению скорости света
[WARN] u.speed_of_light: NaN
[INFO] Скорость света увеличена, начинаем создание темной материи
[ERROR] java.lang.NullPointerException: null


Пошаговое воспроизведение:


Выводим [INFO] Инициализация временных сдвигов
Перезаписываем предыдущую строку, потому что у нее флаг [INFO], теперь последняя
отображаемая строка [INFO] Инициализация временных сдвигов
Выводим новую строку [WARN] u.speed_of_light: NaN.
Выводим новую строку [INFO] Скорость света увеличена, начинаем создание темной материи
потому что перезаписывать варнинги нельзя
Выводим новую строку [ERROR] java.lang.NullPointerException: null.


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

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

#!/bin/bash

last_line=""

while IFS= read -r line
do
    if [[ $line != \[INFO\]* ]];
    then
        echo -e "\n$line"
    elif [[ $last_line == \[INFO\]* ]];
    then
        echo -en "\r$line"
    else
        echo -en "$line"
    fi

    last_line="$line"
done

    


Ответы

Ответ 1



вот такая минипрограмма для интерпретатора awk x!=$номер;{x=$номер} (где номер — это номер сортируемого столбца) делает примерно то, что вам нужно: удаляет последовательные дубликаты, встречющиеся в указанном столбце: $ cat foo | awk 'x!=$1;{x=$1}' [INFO] Инициализация временных сдвигов [WARN] u.speed_of_light: NaN [INFO] Скорость света увеличена, начинаем создание темной материи [ERROR] java.lang.NullPointerException: null но, как видите, печатается содержимое той строки, которая встретилась первой. чтобы печаталось содержимое последней из встреченных строк, можно, конечно, «помудрить» с программой (насколько я понимаю, существенно её усложнив), а можно просто «перевернуть» содержимое файла — чтобы первой шла последняя строка, второй предпоследняя и т.д., а после обработки — «перевернуть» опять. сделать это можно программой tac (даже в названии отражён ей смысл: cat «наоборот»): $ tac foo | awk 'x!=$1;{x=$1}' | tac [INFO] Подготовка к временному увеличению скорости света [WARN] u.speed_of_light: NaN [INFO] Скорость света увеличена, начинаем создание темной материи [ERROR] java.lang.NullPointerException: null идея минипрограммы позаимствована отсюда: http://www.unixcl.com/2009/05/remove-duplicate-consecutive-fields-or.html обновление придумал, как обойтись без tac. минипрограмма, правда, значительно усложняется: $ cat foo | awk 'END{print y}{if(x!=$1&&x!=""){print y};x=$1;y=$0}' чтобы сортировать по другому столбцу, надо подставить его номер вместо 1 в оба вхождения $1. обновление2 из уточнений стало понятно, что требуется не просто конечный результат, а «интерактивное шоу», когда последняя выведенная строка стирается, если следующая за ней начинается тем же самым словом. тогда можно сделать примерно так: #!/bin/bash prevline="" prevtag="" while read line; do newtag=$(echo $line | cut -d ' ' -f 1) if [ -n "$prevline" ]; then if [ "$newtag" == "$prevtag" ]; then echo -n "$prevline" | sed 's/./\x08/g' else echo fi fi echo -n "$line" prevtag=$newtag prevline=$line done echo \x08 — это символ «забоя» (backspace). к сожалению, программа sed, которой я воспользовался в данном случае, не воспринимает распрастранённую escape-последовательность \b в качестве данного символа. связано это с тем, что на данную escape-последовательность «подвешена» функция определения границы слова.

Ответ 2



./foo.bs | awk '{$1==l?p="\r":p="\n"}{printf "%s%-80s",p,$0}{l=$1}' По поводу длинных строк. Тут вам, для начала, необходимо определиться с тем, что вы хотите получить. Можно, например, отключить перенос строк: printf %b '\033[?7l'. Тогда длинные строки будут "обрезаться" по краю окна. Если нужно выводить строку целиком, с переносом, то можно заморочиться с backspace (работает далеко не везде), либо со сложным высчитыванием реального количества выведенных строк (tput cols в помощь). В общем, простого пути нет. Ну и следует помнить, что все эти пляски со спецсимволами очень сильно зависят от настроек как терминала на стороне клиента, так и на стороне сервера.

Парсинг библиотека BeautifulSoup: как получить элементы <a> с заданным атрибутом

#python #beautiful_soup


Есть ссылки вида:

1
2
3

1
2


Как можно получить href'ы только ссылок с атрибутом "chapter"?
    


Ответы

Ответ 1



from bs4 import BeautifulSoup r = ''' 1 2 3 1 2''' soup = BeautifulSoup(r, 'html.parser') for a in soup.find_all('a', chapter=True): print(a)

Ответ 2



Альтернативный и немного более лаконичный способ - использовать CSS селекторы - на данный момент BeautifulSoup поддерживает ограниченный набор селекторов - но для большинства повседневных задач хватает: for a in soup.select('a[chapter]'): print(a) # или print(a.get_text()) чтобы распечатать тексты ссылок

Сохранять базу данных каждую неделю

#mysql #phpmyadmin #события


Возможно ли используя events в phpMyAdmin создать event который позволит мне каждую
неделю сохранять базу данных в папку? 
    


Ответы

Ответ 1



Чтобы сохранять БД каждую неделю (каждый понедельник в 00:00), можно с помощью cron'a выполнять команду mysqldump В правило cron 00 00 * * 1 mysqldump -u{пользователь} -p{пароль} --all-databases > /{path_to_backups}/mysqldump_`$(date +\%Y\%m\%d\%H\%M\%S)`.sql

Python, байты и числа в integer

#python #python_3x #типы_данных


Осваиваю постепенно пайтон, пишу программу для общения с AVR контроллером через блютуз.

Из сокета я получаю данные в виде строки байт такого вида b'\xb1\xaa\xab\xac\xad\xae\xaf'.

Так как я пишу свой протокол и работаю с разными типами данных (отправляю их с МК
не в символьном виде), разбиваю строку на части, к примеру: b'\xb1', b\xaa\xab' и b\xac\xad\xae\xaf',
то есть на однобайтовый int, двухбайтовый int и четырёхбайтовый int, с чем проблем
не возникает.

Главная задача - преобразовать эти байтовые последовательности в исходные числа.
Однобайтовый int вполне получается преобразовать так:

In [64]: line = b'\t\xaa\xab\xac\xad\xae\xaf'
In [65]: line [0]
Out[65]: 9
In [72]: a = line [0]

In [73]: a
Out[73]: 9

In [74]: a += 1

In [75]: a
Out[75]: 10


Но вот метод преобразования в число двух и более бай мне неведом. В результате поиска
больше запутался.
И так, вопрос: как имея в исходных данных байтовые строки вида b\xaa\xab' и b\xac\xad\xae\xaf'
привести их к целочисленному типу данных?
    


Ответы

Ответ 1



Чтобы конвертировать байты в целое число в Питоне 3 в независимости от числа байт: >>> int.from_bytes(b'\xb1', 'big') 177 >>> int.from_bytes(b'\xaa\xab', 'big') 43691 >>> int.from_bytes(b'\xac\xad\xae\xaf', 'big') 2897063599 >>> int.from_bytes(b'\xac\xad\xae\xaf', 'big', signed=True) -1397903697 >>> int.from_bytes(b'\xac\xad\xae\xaf', 'little', signed=True) -1347506772 >>> int.from_bytes(b'\xac\xad\xae\xaf', 'little') 2947460524 Если много однотипных данных, можно array.array, numpy.array использовать для экономии памяти и быстроты работы векторных операций. Если есть обрамляющая структура, то можно прочесть данные, используя struct.Struct, ctypes.Structure (для struct из С).

Ответ 2



Посмотрите в сторону модуля struct, он как раз для этих задач. В Вашем случае: import struct line = b'\xaa\xab\xac\xad\xae\xaf' format = '

Переход на flexbox

#html #css #вёрстка #flexbox


Делаю теги для сайта. Раньше использовал display: inline-block



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

.myclass {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
}


Но проблема в том, что последняя строка смотрится не красиво с выравниванием по ширине:



А если вместо justify-content: space-between использовать justify-content: flex-start,
тогда уже не будет выравнивания по ширине при уменьшении разрешения:



Вопрос: Возможно ли в flexbox обратиться к последней строке? Мне нужно чтобы выравнивание
было по ширине, а в последней строке по левой стороне. Решение может быть реализовано
с помощью javascript

Все получилось благодаря ответу пользователя Vadim Ovchinnikov, за что ему большое
спасибо.
Вот как выглядит то что мне нужно было:

    


Ответы

Ответ 1



То же самое как и ответ @Qwertiy только без div:after { content: ""; display: inline-block; width: 100%; } div { text-align: justify; } span { display: inline-block; border: 1px solid; padding: .25em; border-radius: .5em; margin-top: .5em; }
Assembler C C# C++ CorelDraw HTML & CSS Java JavaScript Microsoft Office Pascal Photoshop PHP Sketch SQL База данных Графика


Ответ 2



div { text-align: justify; } span { display: inline-block; border: 1px solid; padding: .25em; border-radius: .5em; margin-top: .5em; } div:after { content: ""; display: inline-block; width: 100%; }
html css верстка flexbox html css верстка flexbox html css верстка flexbox html css верстка flexbox


Php. Traits. Constants

#php #const #traits


Прошу совета толковых программистов.

Мне часто не хватает возможности (php 5.6) описывать в трейтах константы. Свойства
класса есть, а вот константы не ввели.

Собственно 2 вопроса.

Главный: Как правильно обеспечить множественное наследование с константами на уровне
самого php?

Интересует: Почему разработчики не дали возможность подмешивать в классы константы
с помощью трейтов? Может это плохая практика...

Дополнение: (многие не могут понять "А зачем?") Попробую показать.
Есть в БД много таблиц в которых есть поле status: 0 - выкл, 1 - вкл,
делаем трейт (зачем создавать таблицу для двух значений?)

trait Status
{
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;

    public static function getStatuses()
    {
        return [
            static::STATUS_INACTIVE => 'Inactive',
            static::STATUS_ACTIVE => 'Active',
        ];
    }

    public function getStatusLabel($nullLabel = '')
    {
        $statuses = static::getStatuses();
        return isset($statuses[$this->status]) ? $statuses[$this->status] : $nullLabel;
    }
}


getStatuses() используем для выпадающего списка в форме, getStatusLabel() - тут я
думаю и так ясно. 
и это упрощенный пример.

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

Конечно я могу извратиться и сделать константы через статические свойства 

trait Status
{
    protected static $STATUS_INACTIVE = 0;
    public static function STATUS_INACTIVE() { return static::$STATUS_INACTIVE; }

    protected static $STATUS_ACTIVE = 1;
    public static function STATUS_ACTIVE() { return static::$STATUS_ACTIVE; }


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


Ответы

Ответ 1



Трейты в php реализованы, как copy-paste на уровне интерпретатора. Не стоит ими злоупотреблять. Решение не позволять константы в трейтах мотивировано сложностью разрешения коллизий имён констант. Возможно, когда-нибудь эту проблему решат. А пока, ничто не мешает вам написать так: interface IActiveStatus { const STATUS_INACTIVE = 0; const STATUS_ACTIVE = 1; } trait Status { public static function getStatuses() { return [ static::STATUS_INACTIVE => 'Inactive', static::STATUS_ACTIVE => 'Active', ]; } public function getStatusLabel($nullLabel = '') { $statuses = static::getStatuses(); return isset($statuses[$this->status]) ? $statuses[$this->status] : $nullLabel; } } class A implements IActiveStatus { use Status; } или лучше: interface IActiveStatus { const STATUS_INACTIVE = 0; const STATUS_ACTIVE = 1; } trait Status { public static function getStatuses() { return [ IActiveStatus::STATUS_INACTIVE => 'Inactive', IActiveStatus::STATUS_ACTIVE => 'Active', ]; } public function getStatusLabel($nullLabel = '') { $statuses = static::getStatuses(); return isset($statuses[$this->status]) ? $statuses[$this->status] : $nullLabel; } } class A { use Status; } Хотя, я бы порекомендовал немножко пересмотреть интерфейс: trait Status{ protected $status = IActiveStatus::STATUS_INACTIVE; public function isActive() { return $this->status === IActiveStatus::STATUS_ACTIVE; } public function isInactive() { return $this->status === IActiveStatus::STATUS_INACTIVE; } public function setActive() { $this->status = IActiveStatus::STATUS_ACTIVE; } public function setInactive() { $this->status = IActiveStatus::STATUS_INACTIVE; } public function getStatusLabel() { return ([ IActiveStatus::STATUS_ACTIVE => 'Active', IActiveStatus::STATUS_INACTIVE => 'Inactive', ])[$this->status]; } }

Ответ 2



Можно не через трейты а через интерфейсы сделать. Отлично вписывается в множественное наследование interface IStatus { const STATUS_ENABLED = 1; const STATUS_DISABLED = 0; } interface IExtStatus { const STATUS_BLOCKED = 2; } class Test implements IStatus, IExtStatus { const STATUS_LOCAL = 3; } echo Test::STATUS_BLOCKED; echo Test::STATUS_LOCAL; echo Test::STATUS_ENABLED;

Chrome запуск в новом окне с отключенным звуком

#google_chrome


Собственно, открыть страницу в новом окне можно так -

"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe" "https://
www.youtube.com/watch?v=QH2-TGUlwu4" --mute-audio --new-window


Но звук все равно воспроизводится...
    


Ответы

Ответ 1



Список команд запуска для chrome. --mute-audio присутствует, но не отрабатывает. Даже при включенном флаге chrome://flags/#enable-tab-audio-muting. Еще нашел сочетания клавиш. Alt + Shift + M - отключить звук на активной вкладке. Alt + Shift + , - отключить звук на всех открытых вкладках. Alt + Shift + . - включить звук на всех открытых вкладках.

Ответ 2



1.Ну можешь замутить chrome то замути тупо видео без звука ))) 2.Создай HTML страницу туда ставь видео с ютуба и параметр volume="0" таким образом будет без звука.

Глобальное обновление таблицы данными другой таблицы

#mysql


Сразу скажу, что смотрел это решение и у меня оно не работает. Ругается на FROM.
Есть две таблицы.

CREATE TABLE `test`.`ab` (
`id` INT NOT NULL,
`ids` INT NULL,
PRIMARY KEY (`id`))
ENGINE = MyISAM;

CREATE TABLE `test`.`cd` (
`id` INT NOT NULL,
`ids` INT NULL,
PRIMARY KEY (`id`))
ENGINE = MyISAM;


Есть данные:

INSERT INTO ab (id) VALUES (1);
INSERT INTO ab (id) VALUES (2);
INSERT INTO ab (id) VALUES (7);
INSERT INTO ab (id) VALUES (8);

INSERT INTO cd (id, ids) VALUES (1, 111);
INSERT INTO cd (id, ids) VALUES (5, 555);
INSERT INTO cd (id, ids) VALUES (3, 333);
INSERT INTO cd (id, ids) VALUES (8, 888);


Теперь мне надо в первой таблице AB значение поля ids заполнить значениеми поля ids,
но с таблицы CD по ключевому ID. Уверен, что в MySQL есть решение в одну команду. Я
сам пишу на FoxPro. Там нужно командой SET RELATION TO связать таблицы. Подскажите
как это делается на MySQL.
    


Ответы

Ответ 1



update ab join cd on ab.id=cd.id set ab.ids=cd.ids

Как сгенерировать случайное 64-разрядное целое число

#c_sharp #случайные_числа #генерация_случайных_данных


Как сгенерировать случайное 64-разрядное число (типа long, он же Int64) на C#? 
    


Ответы

Ответ 1



из social.msdn.microsoft.com Можно так: private readonly Random rnd = new Random(); // create it just once and reuse private ulong Get64BitRandom(ulong minValue, ulong maxValue) { // Get a random array of 8 bytes. // As an option, you could also use the cryptography namespace stuff to generate a random byte[8] byte[] buffer = new byte[sizeof(ulong)]; rnd.NextBytes(buffer); return BitConverter.ToUInt64(buffer, 0) % (maxValue - minValue + 1) + minValue; } или так: public static ulong Get64BitRandom(ulong minValue, ulong maxValue) { // Get a random array of 8 bytes byte[] buffer = new byte[sizeof(ulong)]; rnd.NextBytes(buffer); if (minValue == ulong.MinValue && maxValue == ulong.MaxValue) return BitConverter.ToUInt64(buffer, 0); ulong modValue = maxValue - minValue + 1; return (BitConverter.ToUInt64(buffer, 0) % modValue) + minValue; }

Как обновить другую ветку, не переключаясь на нее?

#git


Идея такая, с сделал ветку (например, branch1) с master'а, поработал в ней и хочу
сделать git rebase master, но, например, я знаю что master был обновлен. Дальше, мне
надо делать так:

git checkout master
git pull
git checkout branch1
git rebase master
git push ...


А возможно ли обновить локального master'а не переключаясь с текущей ветки. Что бы
можно было сделать одну команду для обновления и сразу rebase?



UPDATE: Попробую внести ясность в вопрос =). Мне было бы очень удобно обновить следящую
локальную ветку не переключаясь на нее. Под "обновить" я подразумеваю не только историю
коммитов, но и сами локальные файлы, что бы я мог проводить сравнение файлов или rebase
основываясь на локальной ветке. Другими словами, объединить первые три команды в приведенном
примере. Но, и это довольно важное "но", по возможности избежать git checkout master.

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


Ответы

Ответ 1



git fetch git rebase origin/master

Почему при беззнаковом сдвиге байта вправо не обнуляется старший разряд?

#java


byte b = -1;   // b = -1  1111_1111
b <<= 1;       // b = -2  1111_1110
b >>>= 1;      // b = -1  1111_1111


В комментариях - значение b в debug.
В последней строке b должно стать 0111_1111, ведь применялся беззнаковый сдвиг вправо.
В чем ошибка?
    


Ответы

Ответ 1



"Ошибка" в спецификации Java. Все операции с целыми числами выполняются с 32-битной точностью, и их результатом является int (кроме случаев, когда один из операндов - long). Код b >>>= 1; эквивалентен b = (byte)( b >>> 1 ); Оператор сдвига выполняет unary numeric promotion для каждого аргумента, приводя их типы к int (или к long). Расширение byte до int сохраняет значение, т.е. (byte)-2 становится (int)-2, отсюда и появляется единица слева в результате сдвига. Для получения нужного результата можно написать так: b = (byte)((b & 0xFF) >>> 1);

Обмен информацией по WiFi без подключения

#wifi


Всем здравствуйте!
Есть ли возможность передавать полезную нагрузку по WiFi без подключения.
Возможно в hello пакете, где мы представляемся друг другу или каким-нибудь "расширенным"
пингом? В терминологии не очень силен.
Направьте или подскажите, возможно, есть уже решения на данную тему?

*Зачем? Находясь уже в сети, возможность обмениваться информацией с другими устройствами
из другой сети.

Всем огромное спасибо!
    


Ответы

Ответ 1



Обмениваться — вряд ли. Слушать — теоретически... Если все адаптеры принимающих и драйверы для них имеют "режим слежения" (monitor mode), позволяющий слушать абсолютно все пакеты, идущие по одному каналу Wi-Fi. Другие возможности при этом могут быть ограничены. Если пакеты передаются незашифрованными. Если сети, между которыми планируется взаимодействие, находятся на одном канале Wi-Fi (следствие первого пункта): Чего обычно избегают, т. к. разные сети на одном канале мешают работе друг друга (снижают производительность/дальность). ...но такую ситуацию можно разве что создать самостоятельно, "в природе" такое не встречается. Это если предполагать, что у каждого клиента только один Wi-Fi-адаптер. Если есть несколько, они могут работать независимо друг от друга и передавать пакеты между собой. Но это банально.

Динамически менять viewport для выбора мобильной/полной версии

#html #мобильная_разработка #viewport


Делаю мобильную версию. Есть проблема зума. На мобильной версии есть тег:




По кнопке перехода пишется сессия и вместо этого тега пишется другой: 




Проблема в том что браузер "помнит" ширину в 320px и применяет его, initial-scale=1
при этом игнорируется. 

Если указать user-scalable=no, то масштабируется всё правильно, но увеличить пользователь
уже не может. Такой же эффект если поставить minimum-scale=1,maximum-scale=1. А надо
чтобы пользователь мог увеличить части страницы.

Как этого добиться?
    


Ответы

Ответ 1



Попробуйте добавлять этот тег динамически при загрузке страницы var viewPort = document.createElement('meta'); viewPort.name = "viewport"; viewPort.content = "width=1024"; document.getElementsByTagName('head')[0].appendChild(viewPort); Либо менять его же: document.querySelector("meta[name=viewport]") .setAttribute("content", "width=1024"); Если это не поможет, то может быть так что в вашем браузере в принципе нельзя этого сделать - проблема известная.

Ответ 2



Можно попробовать менять содержимое мета-тега уже после того, как зум стал таким, каким нужно. window.onload = function() { setTimeout(function() { var viewport = document.getElementById('desktop'); viewport.setAttribute('content', 'width=1024'); }, 500); };

Программа в трее без окна (WinAPI, C++)

#cpp #winapi


Нужно создать приложение, которое не будет иметь ни видимого окна, ни иконки на панели
задач, и работать только из трея.
Подскажите пожалуйста последовательность действий, а так же с какими параметрами
нужно регистрировать WNDCLASSEX и использовать CreateWindow.
    


Ответы

Ответ 1



Если видимого окна нет, имеет смысл создать Message-Only Window, окно без графического представления, предназначенное исключительно для обработки оконных сообщений: const HWND g_hWnd = CreateWindowEx( /* dwExStyle */ 0, /* lpClassName */ szClassName, /* lpWindowName */ NULL, /* dwStyle */ 0, /* x, y, w, h */ 0, 0, 0, 0, /* hWndParent */ HWND_MESSAGE, /* hMenu */ NULL, /* hInstance */ g_hInst, /* lpParam */ NULL ); Затем обычным порядком создаёте значок в панели уведомлений: #define WM_USER_SHELLICON (WM_USER + 1) NOTIFYICONDATA data; data.cbSize = sizeof(data); data.hWnd = g_hWnd; data.uID = 1; // Можно поставить любой идентификатор, всё равно иконка только одна data.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; data.uCallbackMessage = WM_USER_SHELLICON; data.hIcon = LoadIcon(...); data.szTip = TEXT(...); // Или LoadResourceString, как вариант data.uVersion = NOTIFYICON_VERSION; Shell_NotifyIcon(NIM_ADD, &data);

Ответ 2



Как-то раз делал такую. Не скажу, что правильно :), но работало. Вот основной цикл: g_hInst = GetModuleHandle(NULL); char * szClassName = "EmptyWindow"; WNDCLASSEX wcex = {sizeof(wcex)}; wcex.lpfnWndProc = WndProc; wcex.hInstance = g_hInst; wcex.lpszClassName = szClassName; RegisterClassEx(&wcex); if (g_hWnd = CreateWindow(szClassName, NULL, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, g_hInst, NULL)); { ShowWindow(g_hWnd,SW_HIDE); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } Ну а треевскую иконку создавал в WM_CREATE. Не знаю, насколько это идеологически верно, но работало :)

сумма строк в выборке с WHERE

#mysql #sql


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

SELECT (`delivery`), COUNT(*) 
FROM prod_data 
WHERE `delivery` = 'Евросоюз Cream' OR `delivery` = 'Cream BetaPost' 
GROUP BY `delivery` 


Вопрос: как можно посчитать сумму количества строк по вышеуказанной выборке?
    


Ответы

Ответ 1



Можете считать количество без группировки, фактически получится та же сумма: SELECT COUNT(*) FROM prod_data WHERE `delivery` = 'Евросоюз Cream' OR `delivery` = 'Cream BetaPost'

Ответ 2



SELECT SUM(x) FROM (( SELECT COUNT(*) as x FROM prod_data WHERE `delivery` = 'Евросоюз Cream' OR `delivery` = 'Cream BetaPost' GROUP BY `delivery` ) as prom)

Ответ 3



SELECT (`delivery`), COUNT(*) FROM prod_data WHERE `delivery` IN ( 'Евросоюз Cream', 'Cream BetaPost' ) GROUP BY `delivery` WITH ROLLUP

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта

#c_sharp


Всем привет. Пишу игру "Сапёр", работающую из окна консоли. Возникает ошибка на участке
кода:

                    field = new cell[ySize][];
                    for (int i = 0; i


Ответы

Ответ 1



Ответ @Surfin Bird верный, давайте я объясню, что происходит. Вы объявили массив массивов. Для массива нужно выделять память при помощи new, но элементами вашего массива являются одномерные массивы! Под каждый из них тоже нужно выделять память. Получится такая картинка: field ---> [ элемент 0 ][ элемент 1 ][ элемент 2 ][ элемент 3 ]... | | | | | | | | V V V V [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] Вы создали верхнюю строку, но не остальные. Альтернативным решением могло быть выделение прямоугольного многомерного массива. В этом случае вы получаете сразу нужные элементы: Cell[,] field; // ... field = new Cell[xSize][ySize];

Ответ 2



Похоже, инициализацию нужно заменить на: for (int i = 0; i < ySize; i++){ field[i] = new cell[xSize]; for (int j = 0; j < xSize; j++) field[i][j] = new cell(); } }

Работа с параметрами приложения

#c_sharp


На данный момент параметр сохраняется так

Properties.Settings.Default.us_PathBD = value;
Properties.Settings.Default.Save();


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


Ответы

Ответ 1



Properties.Settings.Default["us_PathBD"] = value;

Ответ 2



Если нет индексатора, как в предыдущем ответе, то можно задать поле с помощью отражений var info = typeof(MyClass).GetField("MyPropName"); info.SetValue(typeof(MyClass), "PropValue"); для свойства, так же только нужно использовать метод typeof(MyClass).GetProperty(...);

Добавление локальной базы данных (.sdf) в VS2015

#c_sharp


Здравствуйте.
Проблема собственно в заголовке - только начал учить С Шарп по предложенной здесь
же книге Head First C#. Но все уроки в ней на основе старой версии VS. Как добавить
local database, программа предлагает только service-based database.
Догадываюсь, что я не первый с этим вопросом, так что заранее извиняюсь.
    


Ответы

Ответ 1



1. Открываем Server explorer 2. Добавляем новое соединение 3. В качестве источника выбираем файл 4. Создаем или выбираем существующий *.mdf 5. Локальная БД MSSQL готова к работе Как выяснилось, в инсталяторе VS2015,в дефолтную конфигурацию не входят Microsoft SQLServer Data Tools, поэтому если при установке использовалась дефолтная конфигурация, нужно запустить инсталятор еще раз, выбрать пункт Modify и выбрать для установки недостающие инструметы работы с данными.

Unity. Загрузка спрайтов пользователем

#c_sharp #unity3d


Возможно ли разработать приложение, которое предложит поля для загрузки собственных
спрайтов пользователю? При загрузке спрайтов, они "привязываются" к какому-либо коллайдеру
на сцене. Потом это все двигается (возможно с анимацией, если нет- тоже ок).
Что стоит прочитать?
    


Ответы

Ответ 1



Есть парочка способов, но сразу оговорка: работает для одиночных спрайтов. То есть SpriteMode будет Single. Для анимации спрайтов нужно минимум их атлас или маппинг (mapping), который сделать в режиме реального времени довольно сложно ибо много нюансов как то: а как разрезать спрайты? Ведь в спрайтлисте могут располагаться не только по какой-либо ровной сетке, но и хаотично, как в атласе. Если разрезать спрайтлист, то где ставить pivot point у каждого спрайта? Как назначить конкретные спрайты из листа в SpriteRenderer? Каков должен быть масштаб? В общем, это будет кошмар и ужас. Поэтому лично я рассматривать сий вариант здесь не буду. Для одиночных спрайтов: Для устройства, на которое нацелено приложение/игра необходимо узнать/изучить методы/способы открытия диалогового окна, в котором можно выбрать картинку и считать оттуда путь до файла. Это обширная тема, поэтому она здесь не вместится. (!!!) В данном ответе я буду рассматривать банально Windows. Зная путь файла можно сделать: а) Использовать класс WWW для загрузки контента. Также, допустим, у вас заранее есть на сцене объекты под спрайты и просто в них нужно воткнуть спрайт. public SpriteRenderer spriteRenderer; string directory = "file://d:/unityProjects/test/spriteTestLoad.jpg"; void Start () { StartCoroutine(LoadImages()); } private IEnumerator LoadImages() { WWW www = new WWW(directory); // Ожидаем загрузку ресурса yield return www; var tex = www.texture; // Создаем спрайт из текстуры var mySprite = Sprite.Create(tex, new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f), 100.0f); // В подготовленный spriteRenderer вставляем спрайт spriteRenderer.sprite = mySprite; } Обратите внимание, что имя директории начинается с file://. Во всяком случае при загрузке файла в Windows с помощью WWW надо указывать именно так. Если загружать с интернета, то просто с http, например: http://images.earthcam.com/ec_metros/ourcams/fridays.jpg Здесь путь к файлу задан жестко, но вы держите в голове, что его надо будет просто заполнять из диалогового окна из пункта №1. б) Используя System.IO;. Пока также допуская, что надо спрайт воткнуть уже в имеющееся место. using UnityEngine; using System.Collections; using System.IO; public class LoadSpriteFromOut : MonoBehaviour { public SpriteRenderer spriteRenderer; string directory = "d:/unityProjects/test/spriteTestLoad.jpg"; void Start () { LoadSprite(); } private void LoadSprite() { byte[] data = File.ReadAllBytes(directory); Texture2D texture = new Texture2D(64, 64, TextureFormat.ARGB32, false); texture.LoadImage(data); texture.name = Path.GetFileNameWithoutExtension(directory); var mySprite = Sprite.Create(texture, new Rect(0.0f, 0.0f, texture.width, texture.height), new Vector2(0.5f, 0.5f), 100.0f); spriteRenderer.sprite = mySprite; } } в) (переделанный "а") И не надо забывать, что можно создавать объекты динамически, поэтому подготавливать их заранее в Unity не обязательно (здесь используется загрузка из первого варианта): using UnityEngine; using System.Collections; using System.IO; public class LoadSpriteFromOut : MonoBehaviour { string directory = "file://d:/unityProjects/test/spriteTestLoad.jpg"; void Start () { StartCoroutine(LoadImages()); } private IEnumerator LoadImages() { WWW www = new WWW(directory); yield return www; var texture = www.texture; var mySprite = Sprite.Create(texture, new Rect(0.0f, 0.0f, texture.width, texture.height), new Vector2(0.5f, 0.5f), 100.0f); // Создаем объект GameObject gameObjectSprite = new GameObject("myNewGameObjectSprite"); // Прикрепляем компонент SpriteRenderer для спрайтов SpriteRenderer gameObjectSpriteSpriteRenderer = gameObjectSprite.AddComponent(); // втыкаем загруженный спрайт gameObjectSpriteSpriteRenderer.sprite = mySprite; } } Ссылка на классы и методы: Sprite.Create класс WWW www texture

Групповые делегаты

#c_sharp #делегаты


Action a1 = () => Console.Write(1); 
Action a2 = () => Console.Write(2); 
Action a3 = () => Console.Write(3); 
((a1 + a2 + a3) - (a1 + a2))(); 
((a1 + a2 + a3) - (a1 + a3))();


Увидел данный пример и стало интересно. Как в данном случае отрабатывает удаление
делегата. Что происходит при (a1 + a2) и (a1 + a3), и почему первый вариант удаляет
как надо а второй не срабатывает вовсе?
    


Ответы

Ответ 1



Пускай a1 + a2 + a3 превращается в делегат, который условно обозначим [a1, a2, a3], a1 + a2 -- [a1, a2], a1 + a3 -- [a1, a3]. При вычитании в [a1, a2, a3] ищется кусок подряд, который равен вычитаемому. Для [a1, a2] такой кусок найдётся, начиная с индекса 0, а для [a1, a3] -- нет. Поэтому при вычитании [a1, a2, a3] - [a1, a2] получается [a3], а при вычитании [a1, a2, a3] - [a1, a3] подходящий кусок не находится, и вычитание не происходит. Смысл такого правила в том, что если уж делегат получен сложением одного списка с другими, то это первый список будет найден в суммарном делегате как подсписок. Поэтому вычитание в этом случае имеет смысл. Цитата из стандарта, параграф 7.8.5: ... Результатом является новый список вызова, состоящий из списка первого операнда с удалёнными элементами списка второго операнда, при условии, что второй список является непрерывным (нетривиальным) подсписком первого [...] В противном случае, результатом является вычитаемое.

Как получить доступ к содержимому json-строки

#javascript #jquery #json


Есть json-строка:

{
    "success":true,
    "data":{
        "BKK":{
            "origin":"IEV",
            "destination":"BKK",
            "price":7936,
            "transfers":1,
            "airline":"FZ",
            "flight_number":730,
            "departure_at":"2017-01-16T03:20:00Z",
            "return_at":"2017-03-08T12:10:00Z",
            "expires_at":"2016-12-29T12:07:13Z"
        },
        "DXB":{
            "origin":"IEV",
            "destination":"DXB",
            "price":2378,
            "transfers":0,
            "airline":"FZ",
            "flight_number":728,
            "departure_at":"2017-01-12T14:25:00Z",
            "return_at":"2017-01-31T19:55:00Z",
            "expires_at":"2016-12-29T18:48:32Z"
        }
    },
    "error":null,
    "currency":"UAH"
}


И когда я пытаюсь получить доступ к значению поля, например, origin, то получаю ошибку
Uncaught TypeError: Cannot read property 'origin' of undefined
:

for(var i = 0; i < 3; i++) {
    pwf.append('
Пункт отправки:' + json.data[i].origin + '
'); } Подозреваю, что это из-за того, что у массивов данных разные ключи, но как решить проблему - не знаю.


Ответы

Ответ 1



json.data не массив, а обычный объект. Можно пройтись по всем его свойствам: for (var p in json.data) { pwf.append('
Пункт отправки:' + json.data[p].origin + '
'); }

Рекурсия и стек

#javascript #рекурсия #стек


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

function power (base, exponent){
   if (exponent == 0)
       return 1;
   else
       return base * power(base, exponent -1);
}

console.log(power(2, 3));


Можете ли объяснить по шагам как тут всё устроено? 
    


Ответы

Ответ 1



Вызываем функцию с параметрами (2,3), т.е. функция имеет данный вид: function power (2, 3){ if (3 == 0) return 1; else return 2 * power(2, 3 - 1); } Далее функция(назовем ее внешняя) вызывает сама себя и создает новый уровень вложенности( назовем клон 1 ), (PS внешняя не может завершиться пока не завершатся все внутренние(клоны)) далее клон 1 вызывает сам себя и создает новый уровень вложенности( назовем клон 2 ), далее клон 2 вызывает сам себя и создает новый уровень вложенности( назовем клон 3 ), далее на клоне 3 срабатывает условие if, значит return 1 и клон 3 возвращает единицу клону 2. На клоне 2 срабатывает условие else т.е. 2 * 1( единицу вернул клон 3) , и результат(двойка) возвращается клону 1 На клоне 1 срабатывает условие else т.е. 2 * 2( двойку вернул клон 2 ), и результат(четверку) возвращает внешней функции На внешней функции срабатывает условие else т.е. 2 * 4( четверку вернул клон 1 ), и возвращает результат(восьмерку ) в консоль. Нарисовал схему работы данной функции:

Ответ 2



function power (base, exponent){ //Посчитаем силу базы (хз что это, но надо так надо :) //Если экспонента точно равна нулю, то мы знаем ответ! if (exponent == 0) { return 1; //и он равен нулю } else { //Но если экспонента нулю не равна, то ответ мы не знаем //Попробуем уменьшить экспоненту на 1 и посчитать снова exponent = exponent - 1; //результатом работы функции будет число, умноженное на результат работы ЭТОЙ же функции, но с экспонентой, уменьшенной на 1 return base * power(base, exponent); } //Если придет значение экспоненты меньше нуля, то все, браузеру хана :) }

Как закрыть файл после отправки его на почту?

#c_sharp


У меня есть программа, каждые 30 секунд она записывает свои действия в файл .txt.
В backgroundWorker каждые 30 мин этот файл отправляется мне на почту, но после отправки
при попытке записать данные в файл выходит ошибка "этот файл используется в другом потоке".
Пожалуйста помогите решить проблему.

Вот код отправки:

MailMessage mail = new MailMessage("От кого", "Кому","Заголовок", "Текст сообщения");
SmtpClient client = new SmtpClient("smtp.mail.ru");
client.Port = 587;
System.Net.Mail.Attachment data = new System.Net.Mail.Attachment(nameDoc); // nameDoc
- переменная содержащая путь к файлу
client.Credentials = new System.Net.NetworkCredential("логин", "пароль");
client.EnableSsl = true;
mail.Attachments.Add(data);
client.Send(mail);

    


Ответы

Ответ 1



Attachment реализует IDisposable, попробуйте явно его уничтожать: MailMessage mail = new MailMessage("От кого", "Кому","Заголовок", "Текст сообщения"); SmtpClient client = new SmtpClient("smtp.mail.ru"); client.Port = 587; client.Credentials = new System.Net.NetworkCredential("логин", "пароль"); client.EnableSsl = true; using (System.Net.Mail.Attachment data = new System.Net.Mail.Attachment(nameDoc)) { mail.Attachments.Add(data); client.Send(mail); } А лучше уничтожайте целиком MailMessage: SmtpClient client = new SmtpClient("smtp.mail.ru"); client.Port = 587; client.Credentials = new System.Net.NetworkCredential("логин", "пароль"); client.EnableSsl = true; using (var mail = new MailMessage("От кого", "Кому","Заголовок", "Текст сообщения")) { var data = new System.Net.Mail.Attachment(nameDoc)); mail.Attachments.Add(data); client.Send(mail); }

Зачем нужен ebp, если можно без него [закрыт]

#ассемблер


        
             
                
                    
                        
                            Закрыт. Этот вопрос необходимо уточнить или дополнить
подробностями. Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Добавьте больше подробностей
и уточните проблему, отредактировав это сообщение.
                        
                        Закрыт 3 года назад.
                                                                                
           
                
        
Зачем нужно использовать регистр ebp при организации стека программы, если можно
обойтись и без него(если нет хитрых асм вставок)? Почему нельзя по умолчанию использовать
такую оптимизацию? С чем это связанно?
    


Ответы

Ответ 1



Связано это в первую очередь с удобством. Никто не мешает вам адресоваться через регистр esp. Но при этом нужно постоянно держать в голове что сам стековый указатель в процессе выполнения кода может прыгать как угодно. И постоянно менять смещение для одних и тех же сущностей (а вам было бы удобно, если сейчас переменная называется foo, а через пару строк к ней нужно обращаться как к bar?). В совсем простеньких случаях это может иметь смысл, сам так делаю :) Например: print_uint: pushad push dword [esp+36] push format_u ; "%u", 0 call printf pop eax pop eax popad ret 4 Да и компиляторы могут генерировать код без enter/leave при оптимизации. Но в общем случае это "микрооптимизация" (и то под вопросом), и не стоит она того геморроя, который за собой тащит.

Ответ 2



Можно и без него (а очень жаль иногда). Например, gcc для тестовой программки #include int f() { return puts("xaxa"); } int main(void) { long a = 10; long long b = 11; int l = 100; float e = 8.8; f(a, b, l, e); return 0; } с флагами оптимизации avp@avp-ubu1:hashcode$ gcc -O -S t.c avp@avp-ubu1:hashcode$ gcc --vers gcc.real (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. avp@avp-ubu1:hashcode$ делает код без использования ebp(rbp) для организации фреймов стека .file "t.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "xaxa" .text .globl f .type f, @function f: .LFB23: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movl $.LC0, %edi call puts addq $8, %rsp .cfi_def_cfa_offset 8 ret .cfi_endproc .LFE23: .size f, .-f .globl main .type main, @function main: .LFB24: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movsd .LC1(%rip), %xmm0 movl $100, %edx movl $11, %esi movl $10, %edi movl $1, %eax call f movl $0, %eax addq $8, %rsp .cfi_def_cfa_offset 8 ret .cfi_endproc .LFE24: .size main, .-main .section .rodata.cst8,"aM",@progbits,8 .align 8 .LC1: .long 2684354560 .long 1075943833 .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609" .section .note.GNU-stack,"",@progbits

Маскирование фонов CSS

#css #svg #background #clip_path


Добрый день уважаемые. Подскажите как реализовать маскирование фонов в CSS ? 


Необходимо добиться что б на выходе получить красный круг (5штук) с чёрным обводом.
Эффект как-будто в диве с классом el дырка и через него просвечивает нижний фон. Я
пробовал через clip-path но оно обрезает наружное, а мне надо то что внутри что б вырезало



.block{
  width: 100px;
  height: 500px;
  background-color: red;
}
.el{
   width: 100px;
  height: 100px;
  background-color: black;
/*    -webkit-clip-path: circle(50% at 50% 50%);
   clip-path: circle(50% at 50% 50%); */
}


Ответы

Ответ 1



А может попробовать маски для этой цели. Сделаем из круга маску и сквозь нее будем смотреть на подложку. В первом варианте у меня красный квадрат подложка, а во втором растровое изображение. Теперь цветы. Фотка Yoksel и идеи её по использованию масок Вот в качестве маски шестиугольник Отличная статья о масках от Yoksel

Ответ 2



Такое ощущение, что недавно отвечал на такой же вопрос на SO. Чёрная часть маски убирается из элемента, а белая остаётся: html, body { height: 100%; margin: 0; background: linear-gradient(to top, red, blue); } svg { display: block; width: 150px; }

Перенос SVG файлов из HTML в CSS

#css #svg #background


Добрый день уважаемые. Подскажите пожалуйста как перенести написание SVG фаила из
html в background css ?



.heart{
                 position: absolute;
                 top: 0;
                 bottom: 0;
                 left: 0;
                 right: 0;
                 height: $heartSide;
                 width: $heartSide;
                 display: block;
                 background: url('data:image/svg+xml;utf8,') 0 0 no-repeat;
                  z-index: 1; 
 }
Не могу понять где я допускаю ошибку. Если разкомитить в html всё отображается как надо, а вот в css нет


Ответы

Ответ 1



Убрать переносы внутри свг. fill перенести внутрь атрибута style. enable-background убрать вовсе. .heart { position: absolute; top: 0; bottom: 0; left: 0; right: 0; height: 100px; width: 100px; display: block; background-image: url('data:image/svg+xml;utf8,'); z-index: 1; }


Ответ 2



не советую делать так. лучше сохраните вашу картинку в отдельный .svg файл, а далее разместите его как обычный img. Вы также сможете менять и свойство .svg файла с помощью CSS, если он будет в отдельном файле. Если же вы все же хотите добавить его в CSS файл, то вот вам способ: Переведите ваш файл в base64 и вставляйте полученный код вот в так: .КАРТИНКА { background: url("data:image/svg+xml;base64,[полученный_конвертированный_код]"); }