Страницы

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

суббота, 27 апреля 2019 г.

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

Пытаюсь конвертировать кирилицу из 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
И другой вопрос:
Если конвертировать стих, то после окончания строки на пустом месте выводится

. Как избавиться от этих символов?


Ответ

Можно воспользоваться 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. Поворот изображения туда-обратно

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


Ответ

Позволил себе чуть изменить код 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); } }

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

int main(void) {
printf("%d",(int)'А'); }
По идее, программа должна вывести код 'А'(кириллица), т.е. 192, но почему-то выводит -64.


Ответ

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

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

Хотел сделать алиас 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 перечисляет список директорий / файлов по пути /, так почему же тогда он возвращает обратно в домашнюю директорию?


Ответ

псевдоним оболочки (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 правильнее передавать не только первый аргумент, а все аргументы ($@), а чтобы корректно обрабатывались спец-символы (например, пробелы/кавычки и т.п.) внутри аргументов, список лучше заключить в двойные кавычки ("$@").

MVVM для начинающих

Пытаюсь вникнуть в суть MVVM, рассматривая простейшие примеры и мне непонятны некоторые вещи,такие как:
public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName]string prop = "") { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
Также непонятно как работает интерфейс INotifyPropertyChanged Может ли кто-нибудь все это объяснить? P.S. на MSDN и других сайтах был и читал,но понятнее не стало


Ответ

Попробую объяснить.
Между View(графический интерфейс программы (кнопки, текстовые поля, и проч.)) с помощью так называемого байдинга (кто-то называет биндинг, хотя это неправильное произношение) устанавливается связь со свойствами во ViewModel. Например с текстовым полем ввода мы связываем свойство (ViewModel) - public string Name { get; set; } с помощью записи в XAML (View) Для этого во ViewModel реализуют (наследуют) от стандартного интерфайса INotifyPropertyChanged. В вашем примере используется один из вариантов такой реализации:
public event PropertyChangedEventHandler PropertyChanged; - собственно само объявление нужного события.
public void OnPropertyChanged([CallerMemberName]string prop = "") - вспомогательный метод для вызова этого события из блока set;
[CallerMemberName] - атрибут у параметра, который позволяет не указывать название свойства программисту, компилятор сам подставит имя свойства, которое вызывает метод OnPropertyChanged, т.е. вы можете вызвать как OnPropertyChanged("Name") или же так OnPropertyChanged() и тогда ("Name") вместо вас подставит компилятор.
Далее в самом методе происходит проверка; а если ли у этого события подписчики? И в случае наличия таковых (у нас это Такой вариант вызова события не единственный, в интернетах и в книгах можно найти еще пару-тройку вариантов. Все это дело вкусовщины. Лично я люблю прямой вызов события, что называется "в лоб", покажу на примере, может вам станет все еще яснее.
public class MainViewModel : INotifyPropertyChanged //не забываем о наследовании
Присваиваем в объявлении события пустой делегат, чтобы потом не заниматься проверкой, а если ли подписанты на событие? Они теперь всегда есть, по крайней мере один пустой подписант.
public event PropertyChangedEventHandler PropertyChanged = delegate { };
А вот пример свойства с вызовом этого события (использую новую конструкцию nameof(), чтобы передать название свойства)
///

/// Имя скачиваемого видео файла /// private string _NameFileVideo; public string NameFileVideo { get { return _NameFileVideo; } set { if (_NameFileVideo == value) return; _NameFileVideo = value; PropertyChanged(this, new PropertyChangedEventArgs(nameof(NameFileVideo))); } }

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

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


Ответ

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

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

Как вызвать метод 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));


Ответ

Для начала сделаем метод для поиска файлов по маске. Работает с .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\ будет только один из этих файлов, который будет копироваться последним (он и перезатрёт существующий, и скопированный первым в целевую папку файл).
Если же нужно скопировать файлы из папки с сохранением структуры вложенных папок и файлов, то вот тут уже давал ответ

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

Есть такое приложение GetTaxi так вот когда есть доступное обновление, то при открытии приложения появляется pop-up и сообщает юзеру о доступном обновлении.
Я знаю что play market тоже предлагает обновления, но ведь это все регулируется настройками и можно отключить автоматическое обновление, нотификациию и все прочие.
Так вот я думаю сделать так, когда есть новый versionCode сохранять его значение на сервере, а приложение каждый раз при запуске отправляет запрос на сервер и проверяет совпадает ли цифра с цифрой на сервере, если нет то показываем pop up и прикрепляем ссылку
Вот такая идея)
Я не уверен что такое решение самое правильное поэтому интерисуюсь здесь
Спасибо


Ответ

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

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

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


Ответ

Вы не указали API ключ при подключении API

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

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

Мне нужно отобразить список всех сборок в 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(); } }


Ответ

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

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

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


Ответ

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

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

Представим, что есть некая программа, которая отдает данные вот в таком формате:
$ 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 "
$line" elif [[ $last_line == \[INFO\]* ]]; then echo -en "
$line" else echo -en "$line" fi
last_line="$line" done


Ответ

вот такая минипрограмма для интерпретатора 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-последовательность «подвешена» функция определения границы слова.

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

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


Ответ

из 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; }

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

byte b = -1; // b = -1 1111_1111 b <<= 1; // b = -2 1111_1110 b >>>= 1; // b = -1 1111_1111
В комментариях - значение b в debug. В последней строке b должно стать 0111_1111, ведь применялся беззнаковый сдвиг вправо. В чем ошибка?


Ответ

"Ошибка" в спецификации 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);

В переменной типа long не помещается выражение 300*300

В языке ардуино, если писать
long A = 90000; Serial.println(A);
то все правильно работает, но если писать
long A = 300*300; Serial.println(A);
то выводит 24464. И даже если писать
Serial.println(300*300);
то результат тот же. В чем может быть проблема?


Ответ

Похоже, что выражение
long A = 300*300; ^^^^^^^^
вычисляется, как имеющее тип int, и объект типа int не может вместить в себя результирующее значение.
Запишите следующим образом
long A = ( long )300*300;
или
long A = 300l*300l;
Что касается данной инициализации
long A = 90000;
то для целочисленного литерала компилятор определяет тот целочисленный тип, который может вместить в себя данное значение.
Согласно стандарту C (6.4.4.1 Integer constants)
5 The type of an integer constant is the first of the corresponding list in which its value can be represented
И далее в таблице указывается, что когда литерал не имеет суффикса, то последовательно подбирается тип литерала в порядке int, long int, long long int

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

Допустим, есть такой запрос, который выводит количество строк по каждому фильтру:
SELECT (`delivery`), COUNT(*) FROM prod_data WHERE `delivery` = 'Евросоюз Cream' OR `delivery` = 'Cream BetaPost' GROUP BY `delivery`
Вопрос: как можно посчитать сумму количества строк по вышеуказанной выборке?


Ответ

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

Плавная анимация градиента при наведении

div { width: 100px; height: 30px; background: linear-gradient(90deg, red, green); transition: background 1s; } div:hover { background: red; transition: background 1s; }


Как реализовать плавную заливку градиента в 1 цвет (красный) при наведении?


Ответ

div { position: relative; width: 100px; height: 30px; background: linear-gradient(90deg, red, green); } div:before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: red; opacity: 0; transition: 0.3s; } div:hover:before { opacity: 1; }


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

Всем привет. Пишу игру "Сапёр", работающую из окна консоли. Возникает ошибка на участке кода:
field = new cell[ySize][]; for (int i = 0; i // расставим мины do { int row= rnd.Next(ySize); //координата мины по Y int col=rnd.Next(xSize); //координата мины по X
if (field[row][col].cheсkNearCell()!= (-1)) { field[row][col].setMine();
if (row != 0 && col != 0) field[row - 1][col - 1].newMineNear(); if (row != 0) field[row - 1][col].newMineNear(); if (row != 0 && col != xSize - 1) field[row-1][col + 1].newMineNear(); if (col != 0) field[row][col - 1].newMineNear(); if (col != xSize - 1) field[row][col + 1].newMineNear(); if (row != ySize - 1 && col != 0) field[row + 1][col-1].newMineNear(); if (row != ySize - 1) field[row + 1][col].newMineNear(); if ((row != ySize-1) && (col != xSize-1)) field[row + 1][col + 1].newMineNear(); n++; } } while (n != numberOfMines);
В этом участке кода должен заполняться массив, содержащий "клеточки" из которых состоит поле, и расставляются мины. Код компилируется, игра запускается, но выдаёт ошибку
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
Я подозреваю, что при заполнении массива массивов не вызывается конструктор класса. Вот код класса Cell:
class cell { private bool opend {get; set;} // - посещали ли мы клеточке private bool hasMine {get; set;} // - установлена ли в клеточке мина private bool hasFlag {get; set;} // - установлен ли в клеточке флаг private int minesNear {get; set;} // - мины рядом
private cell() { hasMine=false; opend=false; hasFlag=false; minesNear=0; }
//установить флаг public int setFlag() { if (hasMine==true) {hasFlag=true; return 1;} //1 - мина установлена успешно else return 0; }
//установка мины public void setMine() { hasMine=true; }
//добавление информации о мине поблизости public void newMineNear() { minesNear++; }
//проверка этой клетки на наличие мины public int checkThisCell() { if(hasMine==true) return 666; // 666 - означает наличие мины в данной клетке else if (opend==false) {opend=true; return minesNear;} else return -1; //-1 - означает что мы посещали эту клетку и нужно выбрать другую клетку }
//проверка соседней клетки на наличие мины public int cheсkNearCell() { if (hasMine==true || opend==true) return -1; // -1 - что нужно игнорировать эту клетку else return minesNear; }
//отрисовка клетки public void show() { if (hasFlag==true) Console.Write("F"); // - в клетке установлен флаг else if (opend==false) Console.Write("#"); // - клетка не открывалась ранее else if (minesNear==0) Console.Write(" "); // - рядом нет мин else Console.Write(minesNear); // - есть определённое количество мин } }


Ответ

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

Альтернативным решением могло быть выделение прямоугольного многомерного массива. В этом случае вы получаете сразу нужные элементы:
Cell[,] field; // ... field = new Cell[xSize][ySize];

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

На данный момент параметр сохраняется так
Properties.Settings.Default.us_PathBD = value; Properties.Settings.Default.Save();
Возможно ли обращаться к параметру указав имя в виде строки?


Ответ

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

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

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), и почему первый вариант удаляет как надо а второй не срабатывает вовсе?


Ответ

Пускай 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:
... Результатом является новый список вызова, состоящий из списка первого операнда с удалёнными элементами списка второго операнда, при условии, что второй список является непрерывным (нетривиальным) подсписком первого [...] В противном случае, результатом является вычитаемое.

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

Зачем нужно использовать регистр ebp при организации стека программы, если можно обойтись и без него(если нет хитрых асм вставок)? Почему нельзя по умолчанию использовать такую оптимизацию? С чем это связанно?


Ответ

Связано это в первую очередь с удобством. Никто не мешает вам адресоваться через регистр 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 при оптимизации. Но в общем случае это "микрооптимизация" (и то под вопросом), и не стоит она того геморроя, который за собой тащит.

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

Добрый день уважаемые. Подскажите как реализовать маскирование фонов в 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%); */ }



Ответ

А может попробовать маски для этой цели. Сделаем из круга маску и сквозь нее будем смотреть на подложку. В первом варианте у меня красный квадрат подложка, а во втором растровое изображение.

Теперь цветы. Фотка Yoksel и идеи её по использованию масок

Вот в качестве маски шестиугольник

Отличная статья о масках от Yoksel

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

Добрый день уважаемые. Подскажите пожалуйста как перенести написание 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 нет


Ответ

Убрать переносы внутри свг. 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; }


Command “python setup.py egg_info” failed with error code 1

Устанавливаю pgAdmin 4.
pip install pgadmin4-1.1-py2-none-any.whl
И выводит в конце такое
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-aofWrQ/psycopg2/
Полный текст:
Collecting psycopg2==2.6.2 (from pgadmin4==1.1) Downloading psycopg2-2.6.2.tar.gz (376kB) 100% |████████████████████████████████| 378kB 2.1MB/s Complete output from command python setup.py egg_info: running egg_info creating pip-egg-info/psycopg2.egg-info writing pip-egg-info/psycopg2.egg-info/PKG-INFO writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt' Error: pg_config executable not found.
Please add the directory containing pg_config to the PATH or specify the full executable path with the option:
python setup.py build_ext --pg-config /path/to/pg_config build ...
or with the pg_config option in 'setup.cfg'.
---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-aofWrQ/psycopg2/
То, что написано тут не помогает, по крайней мере первый ответ.


Ответ

У вас не установлен psycorg2 (зависимость pgadmin4 вероятно). При установки pgadmin4, pip автоматически пытается установить необходимые зависимости (только Питон библиотеки—pip не ставит стороннее не Питон ПО как правило).
Ошибка в вопросе возникает из-за попытки компиляции psycorg2 из исходников (не найдена команда pg_config). На моей системе, /usr/bin/pg_config находится в postgresql-common Ubuntu пакете (это не важно, так как фактическую системную установку sudo apt-get install python-psycopg2 или схожая команда выполняет).
Установите psycorg2 нужной версии на вашу систему и повторите pip команду для pgadmin4.
Нас интересует версия, которая видна pip команде:
$ pip show psycopg2
Если хочется более новую версию из исходников собрать, то чтобы автоматически зависимости для компиляции поставить, можно выполнить:
$ sudo apt-get build-dep python-psycopg2
И заново запустить pip install с желаемыми ограничениями на версию.

Android. View элементы меняют дефолтный стиль в зависимости от типа Activity. Как установить единый стиль?

Заметил что при создании различных типов Activity при создании приложения, к ним прикручиваются разные стили для чекбоксов и спиннеров, при создании Активити типа диалог там и вовсе свой стиль у элементов. Где эти стили прописываются в коде и как их на всех типах активити одинаковыми сделать?


Ответ

Стили указываются в манифесте при объявлении активити с помощью атрибута android:theme
В данном манифесте они указаны в теге application и в каждом теге activity
В атрибутах указаны ссылки на ресурс styles
Если в теге activity не указан атрибут android:theme, то берётся родительское значение этого атрибута (т.е. значение android:theme тега application)


Сами описания стилей хранятся в ресурсах (/res/values/styles.xml например)