Страницы

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

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

почему появляется столбец 'Unnamed'

#python #pandas #dataframe #csv


я создал датафрейм , в нём 3 колнки. Перегоняю его в файл. Читаю данные с файла и
вижу новый столбец 'Unnamed' . Всё бы ничего , но я не могу его удалить , вылетает ошибка:

ValueError: labels ['Unnamed'] not contained in axis


откуда вообще он взялся и что с ним делать ?
    


Ответы

Ответ 1



Скорее всего вы сохранили CSV файл с индексом (по умполчанию). Как это проверить: In [31]: df.columns.tolist() Out[31]: ['Unnamed: 0', 'a', 'b', 'c'] Пример: In [16]: df = pd.DataFrame(np.arange(1,10).reshape(3,3), columns=list('abc')) In [17]: df Out[17]: a b c 0 1 2 3 1 4 5 6 2 7 8 9 In [18]: df.to_csv(r'c:/temp/test.csv') теперь если просто прочитать его, то получим столбец Unnamed: 0 (т.к. индекс был безымянным): In [20]: x = pd.read_csv(r'c:/temp/test.csv') In [21]: x Out[21]: Unnamed: 0 a b c 0 0 1 2 3 1 1 4 5 6 2 2 7 8 9 вот как это выглядит в CSV файле: In [22]: print(Path(r'c:/temp/test.csv').read_text()) ,a,b,c 0,1,2,3 1,4,5,6 2,7,8,9 Как это обойти: In [23]: x = pd.read_csv(r'c:/temp/test.csv', index_col=0) In [24]: x Out[24]: a b c 0 1 2 3 1 4 5 6 2 7 8 9 или сохранять DataFrame без индекса: In [25]: df.to_csv(r'c:/temp/test.csv', index=False) In [26]: print(Path(r'c:/temp/test.csv').read_text()) a,b,c 1,2,3 4,5,6 7,8,9 In [27]: pd.read_csv(r'c:/temp/test.csv') Out[27]: a b c 0 1 2 3 1 4 5 6 2 7 8 9

Easy Blockchain

#java #blockchain


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

    int numberOfBlocks = 5;

    for(int i = 1; i <= numberOfBlocks; i++) {

        String endOfNumber = "";

        if (i == 1)
            blockchain.add(new Block(i + "st block", "0"));
        else {
            switch(i) {
                case 2:
                    endOfNumber = "nd";
                    break;
                case 3:
                    endOfNumber = "rd";
                    break;
                default:
                    endOfNumber = "th";
                    break;
            }
        }

        blockchain.add(new Block(i + endOfNumber + " block", blockchain.get(blockchain.size()-1).hash));
        System.out.println("Try to mine block " + i);   
        blockchain.get(i-1).mineBlock(difficulty);
        System.out.println("Blockchain is Valid: " + isChainValid());
    }

    String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
    System.out.println("The blockchain:\n" + blockchainJson);

    


Ответы

Ответ 1



Тебе нужно занести сохранение блока в ветку else после операции switch, вот код: int numberOfBlocks = 5; for(int i = 1; i <= numberOfBlocks; i++) { String endOfNumber = ""; if (i == 1) blockchain.add(new Block(i + "st block", "0")); else { switch(i) { case 2: endOfNumber = "nd"; break; case 3: endOfNumber = "rd"; break; default: endOfNumber = "th"; break; } blockchain.add(new Block(i + endOfNumber + " block", blockchain.get(blockchain.size()-1).hash)); } System.out.println("Try to mine block " + i); blockchain.get(i-1).mineBlock(difficulty); System.out.println("Blockchain is Valid: " + isChainValid()); } String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println("The blockchain:\n" + blockchainJson); В твоем примере, происходит следующее : ты создаешь 1 блок, потом завершается оператор if и ты исполняешь новое сохранение блока, из-за чего вся цепочка перестает быть валидной.

svg GaussianBlur ломается область видимости

#css3 #svg #background


Как правильно задавать параметры для фильтра, чтобы не обрезалось по квадрату.
 Не могу понять, где эта область видимости задается?  



.decor_background {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  height: 100%;
  width: 100%;
  background: linear-gradient(to top left, #111 2%, #221c44);
  filter: blur(20px);
  z-index: 1;
}

.svg_elements {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  height: 100%;
  width: 100%;
  z-index: 2;
}

.svg_circle {
  width: 50px;
}

#svg_elements__full {
  width: 100%;
}

.svg_circle {
  fill: none;
  stroke: #68CADA;
  stroke-width: 5;
}


Ответы

Ответ 1



Область видимости действия фильтра на объект называется - Filter effects region Это прямоугольник, с габаритными размерами width="X%", height="Y%" заданными в определении фильтра Также могут быть заданы координаты левого верхнего угла региона действия фильтра - x="X%" y="Y%" Если эти все параметры не указаны, то они будут по умолчанию равны: x="-10%", y="-10%" width="120%" height="120%" Вы указали в своем примере только width="150%" без height В результате регион действия фильтра уменьшился и подрезал края. Внизу пример с новыми параметрами региона фильтра: .decor_background { position: fixed; top: 0; bottom: 0; left: 0; right: 0; height: 100%; width: 100%; background: linear-gradient(to top left, #111 2%, #221c44); filter: blur(20px); z-index: 1; } .svg_elements { position: absolute; top: 0; bottom: 0; left: 0; right: 0; height: 100%; width: 100%; z-index: 2; } .svg_circle { width: 50px; } #svg_elements__full { width: 100%; } .svg_circle { fill: none; stroke: #68CADA; stroke-width: 5; }
Update Ваш пример работает только Chrome, Opera, Yandex, но не работает в Firefox Необходимо убрать параметр in="offOut" из определения фильтра и тогда будет работать и в Firefox .decor_background { position: fixed; top: 0; bottom: 0; left: 0; right: 0; height: 100%; width: 100%; background: linear-gradient(to top left, #111 2%, #221c44); filter: blur(20px); z-index: 1; } .svg_elements { position: absolute; top: 0; bottom: 0; left: 0; right: 0; height: 100%; width: 100%; z-index: 2; } .svg_circle { width: 50px; } #svg_elements__full { width: 100%; } .svg_circle { fill: none; stroke: #68CADA; stroke-width: 5; }


Error in custom ControlTemplate in TextBox

#wpf #style #textbox


Почему курсор скрывается за TextBox?



    


Ответы

Ответ 1



Почему курсор скрывается за TextBox? потому что он такого же цвета, что и фон. Измените цвет курсора и его станет видно:

Получение сырых данных Audio в js

#javascript #аудио


Допустим есть некий sampe.mp3. Я хочу с помощью javascript извлечь сырые данные и
нарисовать график этого звука. Как это сделать?
    


Ответы

Ответ 1



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

Ответ 2



Ещё одна реализация рисования осциллограммы, и на этот раз без canvas, а путём программного создания графического рисунка стандартного формата прямо в оперативной памяти, (на примере формата BMP) и передачи его в элемент img в качестве src: Визуализатор

Есть нюансы - для правильного отображения должна быть задана ширина img id=oscillogram, кратная четырём, код работает пока только со стерео-аудиофайлами. Быстро декодируются аудиоданные только маленьких аудиофайлов, одна песня требует около минуты ожидания.

Как блокировать движение курсора при up и down в input?

#javascript


Когда есть фокус у input и введен текст. То при нажатии кнопок up и down курсор перемещается
в начало или конец строки. Как это можно предотвратить? Добавляю при событии keyup
stopPropagation и preventDefault.

    $(me.inputSelector).on('keyup', function(e) {

        if (e.keyCode == 38) { // вверх 
            e.stopPropagation();
            e.preventDefault();
            return;
        }
        if (e.keyCode == 40) { // вниз 
            e.stopPropagation();
            e.preventDefault();
            return;
        }
    });

    


Ответы

Ответ 1



Надо повеситься на keydown: document.querySelector('input').addEventListener('keydown', e => { if (e.keyCode == 38 || e.keyCode == 40) { e.stopPropagation(); e.preventDefault(); return false; } }); В момент события keyup нажатие уже обработано браузером

.NET Native компиляция

#c_sharp #net #native


Как скомпилировать проект в .NET Native? Нужного пункта нету, как его включить?
    


Ответы

Ответ 1



В текущем Visual Studio компиляция в .NET Native поддерживается только для проектов UWP с целевой платформой Windows 10. Для удобства отладки, .NET Native применяется лишь для Release-режима компиляции. Если вы создадите такой проект, и зайдёте в его свойства, вы увидите: Источник информации: Getting Started with .NET Native | Microsoft Docs.

Оптимальный алгоритм на графах

#графы


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

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

Может существует более оптимальное решение?




    


Ответы

Ответ 1



А если так: Удалить красную вершину и все ребра, примыкающие к ней. В получившемся графе провести поиск в глубину из синей вершины. Найденная компонента связности и есть искомый результат.

Немного вопросов о многопоточности

#java #многопоточность


Сам не первый год пишу на java, но лишь в рамках хобби, с многопоточностью приходится
не так часто работать. 

Заинтересовали несколько вопросов, а имённо:


Допустим, мне нужно писать и вычитывать примитивный тип на каком-то объекте (из разных
потоков). Допустим, поля открытые (public). 

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

Также справка java уверяет, что чтение и запись примитивных типов, исключая long
и double, тоже являются атомарными. Но как быть с этими двумя? Как я понимаю, их нужно
лишь пометить как volatile. Но есть ли какие-то побочные эффекты, или этот модификатор
только и делает, что гарантирует атомарность операций над переменной?

Хорошо. А теперь, к примеру, я хочу читать и писать поля через геттеры-сеттеры. Если
мои геттеры-сеттеры не меняют состояние каких-либо внешних данных, а лишь читают и
пишут переменную, достаточно ли мне пометить такую переменную как volatile, или же
нужно отмечать геттер/сеттер как syncronized? (При условии, что доступ к переменным
возможен лишь через геттер и сеттер).
Работа с объектами. А конкретно, с объектами, что не меняют состояния. 

К примеру, String. Насколько мне известно, данный тип никогда не меняет состояния,
а все его методы, возвращающие строку, возвращают новый экземпляр. 

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


Благодарю за терпение того, кто сможет на эти вопросы ответить)
    


Ответы

Ответ 1



Важно, что volatile гарантирует видимость. Изменения volatile-поля в одном потоке будут сразу видны в другом. Если вам нужно потокобезопасно выполнить более сложную процедуру, чем присвоение - воспользуйтесь synchronized или j.u.c.Atomic*-типами, чтобы избежать возникновения гонок (race condition). Пример: любой многопоточный счетчик // Плохо private volatile long counter; public long getId() { counter += 1; return counter; } // Хорошо private volatile AtomicLong counter = new AtomicLong(0); public long getId() { return counter.incrementAndGet(); } // Тоже хорошо private volatile long counter; public synchronized long getId() { counter += 1; return counter; } Помните, что synchronized - это всегда явная блокировка (но она довольно дёшева при низкой конкуренции), а Atomic-примитивы используют бесконечный цикл с CAS-инструкциями и могут хорошо оптимизироваться. Объекты с неизменяемым состоянием (например, все поля такого объекта final) назвают immutable объектами, и с ними безопасно работать из разных потоков. Но если внутреннее состояние объекта содержит изменяемый какой-то компонент и он как-то может быть доступен снаружи - придется дополнительно думать о потокобезопасности. Пример: // потокобезопасный класс public final class SafeFoo { private final Date date = new Date(); } // не потокобезопасный класс public final class UnsafeFoo { private final Date date = new Date(); public Date getDate() { return date; } } Первый класс полностью потокобезопасен. Второй - нет. Метод getDate() осуществляет публикацию внутреннего состояния внешнему коду (unsafe publication). И где-то снаружи можно сделать так, изменив внутренне состояние: unsafeFoo.getDate().setHours(0); Защититься от этого можно, например созданием копии: // потокобезопасный класс public final class SafeAgainFoo { private final Date date = new Date(); public Date getDate() { return date.clone(); } }

Помогите исправить Javascript код

#javascript


Есть код, который при уменьшении размера экрана до 800 пикс. выводит после заголовка
дополнительный код:



$(window).resize(function() {
  var width = $('body').innerWidth()
  if (width < 800) {
    $(".zag").after("

Дополнительный Текст

"); } }); Скрытие Блока в зависимости от разрешения монитора

Заголовок

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


Ответы

Ответ 1



$(window).resize(function () { var width = $('body').innerWidth(); if (width < 800) { if ($(".dop").length == 0) { $(".zag").after("

Дополнительный Текст

"); } } else { $(".dop").remove(); } });

Бизнес-логика и ее реализация

#java #многопоточность #ооп




Вначале про бизнес-логику. Есть идея программы, часть функций уже реализована, структура
(как на картинке) уже создана. Встал вопрос насколько такая структура и идея логики
программы вообще применимы, какие в них есть недостатки. Основные действия программы
помещаются в Main и влезают примерно в 10-50 строчек, которые, по сути, являются приказами
для других отделов (инициализация).
Получается, что к Class 2 и Class 3 образуются и взаимодействуют только в Class 1,
а остальные (например Class10, Class25) даже и не предполагают что такие существуют
вовсе, они обращаются только к Class1. Class 1 и Class 10 extend Thread и после инициализации
ожидают, когда их вызовут.

Теперь два главных вопроса:

1. Это вообще возможно? Это первая крупная задача, которая встала передо мной, и
я столкнулся с некоторыми сложностями, которые у меня остались, наверно, из-за нехватки
знаний. А именно: допустим, я создал объект класса Class1 (это в Main). Теперь я хочу
обратиться к нему из класса Class25, чтобы получить ответ на вопрос, который решают
Class2 и Class3. Как это сделать? Важно - я не хочу создавать директора отдела (Class1)
в каждом из подклассов, я хочу чтобы он был один, и в будущем был потоком, если это
возможно.

2. И если это все-таки возможно, то насколько это правильно, почему я не видел такой
логики в других программах? Связь GETTER-SETTER сводится к минимуму, а ООП развивается
по максимуму.
    


Ответы

Ответ 1



Очень хорошие и глобальные вопросы подняты, но вопросов несколько и ответы могут быть очень большими. Отвечу кратко, просто чтобы направить автора вопроса в нужном направлении для развития. Надо знать, что существуют разные паттерны программирования, то есть на Java можно писать по разному, в разном стиле. И одну и ту же задачу можно решить разными способами и библиотеками. В целом, на Java активно используется Spring. Знание Spring с избытком ответит на оба вопроса - как один из вариантов решения. Если решать эти вопросы без Spring, то ответы могут быть другими. По вопросам в целом Если объект экземпляра Class1 должен быть один (читать про паттерн singleton), то объект создается один раз и используется в других объектах по ссылке. А как он будет сделан - это уже решать автору. Вариантов много: сделать static class Class1 или сделать Spring @Bean Class1 или руками создать объект Class1 и передавать в конструкторы других классов по ссылке или через геттеры-сеттеры. П.С. Также полезно разобраться с понятием POJO.

Сохранение композитного объекта в базе

#c_sharp #entity_framework


В домене приложения есть объект/entity Place (Место) и есть у него среди других value
object'ов – координаты на яндекс:карте (x,y и zoom карты):

public class Place
{
    public int Id { get; set; }

    public string Title { get; set; }

    public YandexMapPoint Point { get; set; }
}

public class YandexMapPoint
{
    public float X { get; set; }

    public float Y { get; set; }

    public byte Zoom { get; set; }
}


При этом я хочу, чтобы в базе это хранилось в одной таблице с полями Id, Title, x,
y, zoom – и при чтении из базы разворачивалось обратно в доменный объект. А при сохранении
доменного объекта – наоборот, складировалось в одну таблицу.

Я использую EF (EF6 или Core, не принципиально) Code First.

Как мне описать подобную структуру на уровне работы с базой данных?
    


Ответы

Ответ 1



Конечно, это возможно. Создавая новый проект, я думал, придётся либо с атрибутами помудрить, либо флюэнт-интерфейс заюзать. Но для начала я создал заготовку следующего вида: using System; using System.Data.Entity; using System.Linq; namespace ConAppEF { class Program { static void Main(string[] args) { using (var context = new MyContext()) { Console.WriteLine(context.Places.Count()); } } } public class MyContext : DbContext { public DbSet Places { get; set; } } public class Place { public int Id { get; set; } public string Title { get; set; } public YandexMapPoint Point { get; set; } } public class YandexMapPoint { public float X { get; set; } public float Y { get; set; } public byte Zoom { get; set; } } } После запуска было создана БД с такой таблицей: CREATE TABLE [dbo].[Places] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Title] NVARCHAR (MAX) NULL, [Point_X] REAL NOT NULL, [Point_Y] REAL NOT NULL, [Point_Zoom] TINYINT NOT NULL, CONSTRAINT [PK_dbo.Places] PRIMARY KEY CLUSTERED ([Id] ASC) ); Даже не пришлось ничего делать.

Изменить прямоугольник фокуса на MenuItem

#c_sharp #wpf


Когда наводим мышкой на MenuItem на нем рисуется прямоугольник фокуса, как изменить
его цвет фона и цвет рамки, шаблон? Не нашел в шаблоне MenuItem про него ничего
    


Ответы

Ответ 1



То, что вы имеете ввиду, это не фокус, фокус может (и обычно всегда) находиться на другом пункте меню или на другом контроле. Вам же нужен выделенный (highlighted) пункт меню, соответственно, в шаблоне элемента смотрите триггер именно он срабатывает при наведении курсора на пункт меню, в частности, здесь меняется цвет рамки: Если в градиенте заменить первый цвет на Red, а второй на Green, то получится вот что:

Тонкости работы css.content

#css #content


Задача: размещаю легенду в виде пар "термин":"значение". На форме это выглядит так:


...
Destinationадрес подсети или хоста назначения
Gatewayадрес шлюза, через который данный маршрут доступен
Далее, хочу сделать так, чтобы перед каждой расшифровкой значения шло тире - – | – | –. Чтобы вставить просто минус, использую стиль: table.legend-table tr td:last-child:before { content: " - " } Но хочется, чтобы это было именно тире. Я сделал промежуточный вариант, вставив символ тире в код, благо исходник в UTF-8 и проблемы нет: table.legend-table tr td:last-child:before { content: " – " } Но мне хотелось знать, есть ли нормальный вариант вставить HTML-код перед элементом посредством CSS (то есть – или –) В идеале было бы найти способ вообще вставки чего угодно перед элементом, например иконки или глифа, или еще чего средствами CSS


Ответы

Ответ 1



В свойство content символы юникода могут записываться в 16-битной форме без префикса U+ с экранированием обратным слешем \ . Напрмер, среднее тире – имеет код U+2013 . Полный список символов и их кодов можно найти на https://unicode-table.com/ru/ ul{ list-style:none; padding:0; } li:before{ content:'\2013'; margin-right:5px; }
  • asdas
  • asdas


Вёрстка пагинации на гридах

#css #вёрстка #pagination #css_grid #пагинация


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

Сейчас выходит следующее:


а хотелось бы добиться такого результата:


Второй пример я получил при добавлении min-width: min-content; к классу .pagination__item

но на более широком экране последний элемент не хочет переходить на новую строку
и получается так:




.pagination {
  font-family: Tahoma;
  display: grid;
  grid-gap: 5px;
  grid-auto-flow: column;
  justify-content: start;
  grid-template-columns: repeat(auto-fit, minmax(32px, 1fr));
}

.pagination__list {
  display: grid;
  grid-gap: 5px;
  grid-template-columns: repeat(auto-fit, minmax(32px, min-content));
}

.pagination__item {
  display: grid;
  align-content: center;
  justify-content: center;
  user-select: none;
  text-align: center;
  cursor: pointer;
  box-sizing: border-box;
  padding: 5px;
  border-radius: 3px;
  background-color: #ffffff;
  color: #444444;
  border-width: 1px;
  border-style: solid;
  border-left-color: #dbdbdb;
  border-top-color: #dbdbdb;
  border-right-color: #c4c4c4;
  border-bottom-color: #c4c4c4;
}




    


Ответы

Ответ 1



Вам надо использовать Flex box. Grid для такой цели не подходит, так как предполагает равный размер ячеек в колонке. .pagination { display: flex; flex-wrap: wrap; } .pagination div { user-select: none; cursor: pointer; box-sizing: border-box; padding: 5px; border-radius: 3px; background-color: #ffffff; color: #444444; border-width: 1px; border-style: solid; border-left-color: #dbdbdb; border-top-color: #dbdbdb; border-right-color: #c4c4c4; border-bottom-color: #c4c4c4; margin: 3px; }

Как отключить контекстное меню у тега HTML5 video?

#javascript #html5 #video


У меня реализован live стрим видео webm с использованием MediaSourceExtensions API
на стороне JavaScript. Тег video создаётся без контролов, но по клику правой кнопкой
мыши по области видео можно показать контролы, промотать видео, развернуть на весь экран...

Мне этого не надо - пользователю веб-приложения должны быть доступны только те функции,
которые я запрограммирую, и не более. Как отключить это контекстное меню тега video?

Если это невозможно, может помимо video можно ещё как-нибудь рендерить контент MSE?
Может на canvas?...
    


Ответы

Ответ 1



Первый вариант Используем JavaScript document.getElementById("id1").oncontextmenu = function (e) { return false; };
без меню

c меню
Данный пример сделан с изображением но для видео он тоже сработает, так как отключает контекстное меню на любом элементе. Второй вариант Поверх видео положить прозрачную картинку. Третий вариант Чистый HTML (почти)

Реализовать разные варианты оформления элемента

#html #css


Есть заготовка, как довести её до состояние как на изображении и сделать остальные
два варианта?



.sho_bq-background {
  background: #fafafa;
}

.sho_bq-background:before {
  color: #ff0054;
  content: "\1F676";
  font-size: 4em;
  line-height: 0.1em;
  margin-right: 0.2em;
  vertical-align: -.4em;
}

.sho_bq-background:after {
  color: #ff0054;
  position: relative;
  content: "\1F677";
  font-size: 4em;
  line-height: 0.1em;
  vertical-align: -0.6em;
}

cite span:first-child {
  color: #aeadad;
  font-style: normal;
}

cite span:last-child {
  color: black;
  font-weight: bold;
  font-style: normal;
}

«Идеалами, освещавшими мой путь и сообщавшими мне смелость и мужество, были доброта, красота и истина. Без чувства солидарности с теми, кто разделяет мои убеждения, без преследования вечно неуловимого объективного в искусстве и в науке жизнь показалась бы мне абсолютно пустой»

Автор цитаты: Альберт Эйнштейн


Ответы

Ответ 1



Позиционировать элементы относительно blockquote: blockquote { position: relative; background: #fafafa; padding: 1rem; margin: 1rem; } blockquote:before { position: absolute; left: -10px; color: #ff0054; content: "\1F676"; font-size: 4em; line-height: 0.1em; margin-right: 0.2em; vertical-align: -.4em; } blockquote:after { color: #ff0054; position: absolute; bottom: -20px; right: -10px; content: "\1F677"; font-size: 4em; line-height: 0.1em; vertical-align: -0.6em; } cite span:first-child { color: #aeadad; font-style: normal; } cite span:last-child { color: black; font-weight: bold; font-style: normal; }

«Идеалами, освещавшими мой путь и сообщавшими мне смелость и мужество, были доброта, красота и истина. Без чувства солидарности с теми, кто разделяет мои убеждения, без преследования вечно неуловимого объективного в искусстве и в науке жизнь показалась бы мне абсолютно пустой»

Автор цитаты: Альберт Эйнштейн
Здесь также, как и в первом примере, только нужно изменить цвет элементов и добавить background: white: blockquote { position: relative; background: #fafafa; padding: 1rem; margin: 1rem; background: #fff; border: 2px solid #ccc; } cite span:first-child { color: #aeadad; font-style: normal; } cite span:last-child { color: black; font-weight: bold; font-style: normal; } blockquote:before { color: gray; position: absolute; top: -10px; left: -10px; background-color: white; text-align: center; width: 45px; height: 40px; color: gray; content: "\1F676"; font-size: 4em; line-height: 1em; } blockquote:after { color: gray; background-color: white; width: 45px; height: 40px; position: absolute; text-align: center; bottom: -20px; right: -10px; content: "\1F677"; font-size: 4em; line-height: 1.1em; }

«Идеалами, освещавшими мой путь и сообщавшими мне смелость и мужество, были доброта, красота и истина. Без чувства солидарности с теми, кто разделяет мои убеждения, без преследования вечно неуловимого объективного в искусстве и в науке жизнь показалась бы мне абсолютно пустой»

Автор цитаты: Альберт Эйнштейн


Как убрать первую колонку в DataGrid?

#wpf #datagrid



    
        
            
                
            
        
    

    
        
    

    
        
    



Проблема в том, что в начале появляется неясная колонка (см. скрин ниже). 


Кто то знает как ее убрать?
    


Ответы

Ответ 1



Это не первая колонка (столбец) а заголовок для строки. Его можно убрать с помощью установки в 0 свойства RowHeaderWidth Альтернативный вариант подсказанный Андрей NOP - установить пустой шаблон:

Как сделать открытие recyclerView с конца?

#java #android #recyclerview


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


Ответы

Ответ 1



Добавьте свойство reverseLayout в xml, там где описывается ваш RecyclerView. Оно перевернет ваш RecyclerView. Через xml: app:reverseLayout="true" app:stackFromEnd="true" Программно: LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); layoutManager.setReverseLayout(true); layoutManager.setStackFromEnd(true); recyclerView.setLayoutManager(layoutManager); Надеюсь вам помог мой ответ. update исправил ошибку в коде.

Ответ 2



После присвоения адаптера используйте: recyclerView.scrollToPosition(rv.getAdapter().getItemCount());

JavaFX FXML, для чего Controller?

#java #javafx #controller #fxml


В уроках об FXML говорится об пользе и преимуществах разделения интерфейса и логики
в программах, но есть ещё непонятный мне класс "Controller" (помимо классов логики
и интерфейса) . В чём его идея, какую функцию он выполняет? В чём преимущество такого
подхода? 
    


Ответы

Ответ 1



Возможно, Вам будет интересно мое мнение: Лично я считаю, что термин "controller" в документации FXML следует воспринимать не более, чем то, что в других технологиях называется "code behind". То есть это просто дополнительный код для выполнения задач связанных с отображением "вида" (view). (Под "видом" я здесь имею в виду конкретный участок пользовательского интерфейса). FXMLLoader с помощью инъекций связывает объект контроллера с деревом объектов, которое он нагенерил по fxml-разметке. А также предоставляет некоторые другие возможности, например, одностороннюю привязку ("${expression}") атрибутов-свойств и прочее. Но вот, к примеру, двусторонняя привязка ("#{...}") FXMLLoader'ом так до сих пор не реализована, и класс контроллера — это как раз подходящее место для ее описания. Без сомнения, то, что будет в этом "code behind" полностью зависит от вашего подхода и самодисциплины. Как со стороны размещения бизнес-логики, так и со стороны разделения зон ответственности программиста и дизайнера. Именно Вам решать, будет ли этот класс толстым носителем логики, или лишь тонкой прослойкой между моделью и видом. При этом, даже, если вы будуте использовать какой-то определенный фреймворк (например, mvvmFx), то это не спасет вас от возможности ошибочно разместить часть бизнес-логики модели в "code behind" определенного вида (эта ошибка может и обнаружится, когда такая функциональность потребуется в другом месте). С другой стороны, помня о том, что css-стили (кроме USER_AGENT) имеют определенное преимущество над JavaFx-свойствами узлов, в контроллере имеет смысл описывать настройки интерфейса с помощью JavaFx-свойств, а не заданием css-стилей — для того, чтобы дизайнер впоследствии смог исправить интерфейс указанием css-стилей. И даже в этом случае программист может сказать свое "последнее слово", восстанавливая значение свойства в обработчике изменения этого свойства ;) Под словами "определенное преимущество" я имею ввиду то, что css-стиль перекрывает соответствующее ему свойство. Но только в момент перепроверки стилей. А до этой перепроверки будет действовать свойство. Например, можно установить какое-либо свойство узлу (в обработчике нажатия другой кнопки) и это будет отражено на экране, но при наведении на узел курсора мыши, узлу устанавливается псевдокласс hover и выполняется переустановка его стилей в соответствии с псевдоклассом, тем самым свойство будет заменено стилем. После того, как курсор мыши будет убран с узла, у него будет также убран псевдокласс hover. Это изменение псевдоклассов опять повлечет переустановку стилей узла, но в этих стилях не указано то изменение, которое делалось для свойства в обработчике. Поэтому свойство на экране отражено не будет, хотя оно и работало вначале некоторое время.

Функция сравнения массивов выдаёт true для отличающихся массивов

#javascript


При таком коде функция возвращает true:

function areArraysSame(array1, array2) {
    if (array1.length !== array2.length) {
        return;
    }
    for (var i = 0; i < array1.length; i++) {
        if (array1[i] !== array2[i]) {
            return false;
        } else {
            return true;
        }
    }
} 
alert(areArraysSame([1, 2, 3], [1, 2, 2]));

    


Ответы

Ответ 1



Нельзя возвращать true внутри цикла, пока еще есть непроверенные элементы массивов. function areArraysSame(array1, array2) { if (array1.length !== array2.length) { return false; } for (var i = 0; i < array1.length; i++) { if (array1[i] !== array2[i]) { return false; } } return true; } console.log(areArraysSame([1, 2, 3, 4], [1, 2, 2, 4])); console.log(areArraysSame([1, 2, 3, 4], [1, 2, 3, 4])); console.log(areArraysSame([1, 2, 3, 4], [1, 2, "3", 4]));

Ответ 2



многоуровневое сравнение массивов и объектов var equals = function(arr1, arr2) { var req = false; switch (arr1.constructor) { case Object: req = true; for (var name in arr1) { if (name in arr2) { if (arr1[name] === undefined || arr2[name] === undefined) if (arr1[name] === arr2[name]) continue; else { req = false; break; } if (arr1[name].constructor !== arr2[name].constructor) { req = false; break; } if ([Array, Object, NodeList, HTMLCollection].indexOf(arr1[name].constructor) !== -1) { if (!equals(arr1[name], arr2[name])) { req = false; break; } else continue; } if (arr1[name] !== arr2[name]) { req = false; break; } } else { req = false; break; } } break; case Array: case NodeList: case HTMLCollection: if (arr1.length === arr2.length) { req = true; for (var i = 0, len = arr1.length; i < len && req === true; i++) { if (arr1[i] === undefined || arr2[i] === undefined) if (arr1[i] === arr2[i]) continue; else { req = false; break; } if (arr1[i].constructor !== arr2[i].constructor) req = false; if ([Array, Object, NodeList, HTMLCollection].indexOf(arr1[i].constructor) !== -1) { if (!equals(arr1[i], arr2[i])) req = false; else continue; } if (arr1[i] !== arr2[i]) req = false; } } break; } return req; }; console.log(equals( [1, {s: 1},[1, "a", {gg: "vp"}]], [1, {s: 1},[1, "a", {gg: "vp"}]] )); console.log(equals( [1, {s: 1},[1, "a", {gg: "vp"}]], [1, {s: 1},[1, "a", {gg: 1}]] ));

SQL Management studio автоподстановка

#sql_server


Можно ли сделать так, что бы SQL Management studio при вводе ключевых слов, например
SELECT открывала меню со список?

Например, я ввел SEL, а мне тут же SELECT отобразился.

Или подстановщик ограничен подстановкой названий полей и таблиц?
    


Ответы

Ответ 1



Стандартный IntelliSense так не умеет, зато так умеют: SQL Prompt (not free) ApexSQL Complete (free) SQL Assistant (not free) SQL Complete (free) SSMSBoost (free) и другие помощники, с более объемным списком можно ознакомиться тут и тут.

Какова методология работы клиента с сервером на android

#java #android #сеть


Я работаю на .Net C#. Сейчас появилась необходимость мигрировать на android. И задача
в написании именно клиента, так как сервер на C# написан и работает на десктопе.  

На C# взаимодействие клиента с сервером выглядело достаточно логично: 

  connect = new MyConnect(address, port);   
  ....    
  connect.Send("select ......... ;");  // SQL запрос  
  Object obj = connect.Receive();      
  ....      


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

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


Ответы

Ответ 1



Мне кажется в вашем случае имеет смысл запустить Service в котором уже будет открыто соединение. И общатся с сервисом по средствам Broadcast. Таким образом вам не нужно закрывать соединение каждый раз.

Ответ 2



Используйте Retrofit 2 для работы с API пруф. А то что в другом потоке это нормально для Android, чтобы UI не ждал ответа сервера и не было сообщения ANR.

Ответ 3



Почему я решил ответить на свой же вопрос? Во-первых, потому, что принятый мною ответ оказался достаточно тяжеловесным. Все-таки, это не та задача, как мне кажется, для решения которой надо писать отдельную службу. Тем не менее, большое спасибо Anton111111 ! Во-вторых, потому, что многократный поиск в Google ответа так и не дал - все решения давались исключительно для общения приложения с веб-сайтами, а для работы терминала сбора данных с сервером базы данных по локальной сети не подходили. В конце концов, решил таки я свою проблему. Решается она посредством AsyncTask. Вот "выжимка" из класса для открытия и закрытия соединения, и для передачи и приема данных. Если кому-то пригодится - буду рад! Кодировка UTF_16 выбрана исключительно из-за особенностей моего внутреннего протокола - в начале каждого пакета передается количество байт в пакете. Кодировка UTF8 в моем случае не подходит. По сути, это первый мой код, потому прошу, не судите строго :) public class dbClient { private String chSet = "UTF_16LE"; private Socket mSocket = null; private int mPort = 11963; public boolean isConnected = false; public String strSend; public boolean isDone = false; public dbClient() {} public void openDB(String _user, String _ip, int _port) { mUser = _user; mIP = _ip; mPort = _port; try { AsyncOpenConnection at = new AsyncOpenConnection(); at.execute(); at.get(); isConnected = true; } catch (Exception e) { close(); } return; } public void send(String _str) { strSend = _str; try { AsyncSend at = new AsyncSend(); at.execute(); at.get(); } catch (Exception e) { close(); } return; } public boolean recv() { boolean ret = false; try { AsyncRecv at = new AsyncRecv(); at.execute(); at.get(); ret = true; } catch (Exception e) { close(); } return ret; } public void close() { isConnected = false; try { AsyncCloseConnection at = new AsyncCloseConnection(); at.execute(); at.get(); } catch (Exception e) { } return; } //---------------- Классы AsyncTask ----------------------- // Класс AsyncTaskOpenConnection class AsyncOpenConnection extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); isConnected = false; isDone = false; } @Override protected Boolean doInBackground(Void... params) { try { openConnection(); isConnected = true; isDone = true; } catch (Exception e) { e.printStackTrace(); } return isConnected; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); } } // Класс AsyncSend class AsyncSend extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); isDone = false; } @Override protected Boolean doInBackground(Void... params) { try { sendData(strSend.getBytes(chSet)); isDone = true; } catch (Exception e) { e.printStackTrace(); } return isDone; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); } } class AsyncRecv extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); isDone = false; } @Override protected Boolean doInBackground(Void... params) { try { recvData(); isDone = true; } catch (Exception e) { e.printStackTrace(); } return isDone; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); } } class AsyncCloseConnection extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Boolean doInBackground(Void... params) { try { closeConnection(); } catch (Exception e) { e.printStackTrace(); return false; } return true; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); } } public void sendData(byte[] data) throws Exception { if (mSocket == null || mSocket.isClosed()) { throw new Exception("Невозможно отправить данные. Сокет не создан или закрыт"); } try { /* Отправка данных */ mSocket.getOutputStream().write(data); mSocket.getOutputStream().flush(); } catch (IOException e) { throw new Exception("Невозможно отправить данные: " + e.getMessage()); } } public void recvData() throws Exception { byte[] buf = new byte[1024 * 8]; try { int cnt = mSocket.getInputStream().read(buf, 0); } catch (IOException e) { throw new Exception("Невозможно считать данные: " + e.getMessage()); } } private void openConnection() throws Exception { closeConnection(); try { mSocket = new Socket(mIP, mPort); } catch (IOException e) { throw new Exception("Невозможно создать сокет: " + e.getMessage()); } } private void closeConnection() { if (mSocket != null && !mSocket.isClosed()) { try { mSocket.close(); } catch (IOException e) { Log.e(LOG_TAG, "Невозможно закрыть сокет: " + e.getMessage()); } finally { mSocket = null; } } } }

RAM info with dmidecode --type 17

#linux #memory #hardware #ram


На материнской плате ASUS V-PRO Z77 установлены 2х2 (Kingston и Corsair) планок оперативной
памяти. Все четыре планки оперативной памяти нареканий в работе не вызывают. Работают
исправно. Но, ниже представлен вывод результата запуска программы Dmidecode и в выводе
меня интересуют следующие строки:  

Error Information Handle: 0x0060  
Error Information Handle: 0x0063  


Что это значит и с чем связана такая информация?  

$ sudo dmidecode --type 17
# dmidecode 2.12
# SMBIOS entry point at 0x000f04c0
SMBIOS 2.7 present.

Handle 0x005B, DMI type 17, 34 bytes
Memory Device
    Array Handle: 0x005C
    Error Information Handle: 0x0060
    Total Width: 64 bits
    Data Width: 64 bits
    Size: 4096 MB
    Form Factor: DIMM
    Set: None
    Locator: ChannelA-DIMM0
    Bank Locator: BANK 0
    Type: DDR3
    Type Detail: Synchronous
    Speed: 1333 MHz
    Manufacturer: Kingston
    Serial Number: 9333B00B
    Asset Tag: 9876543210
    Part Number: 99U5584-007.A00LF 
    Rank: 1
    Configured Clock Speed: 1333 MHz

Handle 0x005F, DMI type 17, 34 bytes
Memory Device
    Array Handle: 0x005C
    Error Information Handle: No Error
    Total Width: 64 bits
    Data Width: 64 bits
    Size: 4096 MB
    Form Factor: DIMM
    Set: None
    Locator: ChannelA-DIMM1
    Bank Locator: BANK 1
    Type: DDR3
    Type Detail: Synchronous
    Speed: 1333 MHz
    Manufacturer: 029E
    Serial Number: 00000000
    Asset Tag: 9876543210
    Part Number: CMZ8GX3M2A1600C9  
    Rank: 2
    Configured Clock Speed: 1333 MHz

Handle 0x0062, DMI type 17, 34 bytes
Memory Device
    Array Handle: 0x005C
    Error Information Handle: 0x0063
    Total Width: 64 bits
    Data Width: 64 bits
    Size: 4096 MB
    Form Factor: DIMM
    Set: None
    Locator: ChannelB-DIMM0
    Bank Locator: BANK 2
    Type: DDR3
    Type Detail: Synchronous
    Speed: 1333 MHz
    Manufacturer: Kingston
    Serial Number: 1D10C373
    Asset Tag: 9876543210
    Part Number: 99U5584-018.A00LF 
    Rank: 1
    Configured Clock Speed: 1333 MHz

Handle 0x0065, DMI type 17, 34 bytes
Memory Device
    Array Handle: 0x005C
    Error Information Handle: No Error
    Total Width: 64 bits
    Data Width: 64 bits
    Size: 4096 MB
    Form Factor: DIMM
    Set: None
    Locator: ChannelB-DIMM1
    Bank Locator: BANK 3
    Type: DDR3
    Type Detail: Synchronous
    Speed: 1333 MHz
    Manufacturer: 029E
    Serial Number: 00000000
    Asset Tag: 9876543210
    Part Number: CMZ8GX3M2A1600C9  
    Rank: 2
    Configured Clock Speed: 1333 MHz  


UPD

$ sudo dmidecode --type 18
# dmidecode 2.12
# SMBIOS entry point at 0x000f04c0
SMBIOS 2.7 present.

Handle 0x005D, DMI type 18, 23 bytes
32-bit Memory Error Information
    Type: OK
    Granularity: Unknown
    Operation: Unknown
    Vendor Syndrome: Unknown
    Memory Array Address: Unknown
    Device Address: Unknown
    Resolution: Unknown

Handle 0x0060, DMI type 18, 23 bytes
32-bit Memory Error Information
    Type: OK
    Granularity: Unknown
    Operation: Unknown
    Vendor Syndrome: Unknown
    Memory Array Address: Unknown
    Device Address: Unknown
    Resolution: Unknown

Handle 0x0063, DMI type 18, 23 bytes
32-bit Memory Error Information
    Type: OK
    Granularity: Unknown
    Operation: Unknown
    Vendor Syndrome: Unknown
    Memory Array Address: Unknown
    Device Address: Unknown
    Resolution: Unknown

Handle 0x0066, DMI type 18, 23 bytes
32-bit Memory Error Information
    Type: OK
    Granularity: Unknown
    Operation: Unknown
    Vendor Syndrome: Unknown
    Memory Array Address: Unknown
    Device Address: Unknown
    Resolution: Unknown

    


Ответы

Ответ 1



Это значит, что информация об ошибках находится в других записях с номерами 0x0060 и 0x0063 соответственно. Дабы узнать, что за ними скрывается dmidecode следует запустить без параметров и просмотреть вывод. Номера handel'ов указываются в заголовках в выводе следующим образом: Handle 0x005B, DMI type 17, 34 bytes Memory Device Вероятно их тип будет 18 (32-bit Memory Error Information) или 33 (64-bit Memory Error Information). По всей видимости само наличие значения в поле Error Information Handle покуда в структуре на которую он ссылается значение Type: OK. Как именно представляются данные определяется реализацией.

C# Создание экземпляра потомка по типу, определенному в базовом классе

#c_sharp #ооп


Есть базовый класс

public abstract class Session
{
    public abstract SessionType SessionType { get; }
}


И есть куча его наследников, возвращающих нужный тип SessionType.

Каждому типу строго соответствует один наследник.

Вопрос:

Как создать экземпляр нужного потомка зная тип.

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


Ответы

Ответ 1



Как вариант можно сделать свой атрибут, через который вы будете устанавливать соответствие типов между Session и SessionType: [AttributeUsage(AttributeTargets.Class)] public class SessionAttribute : Attribute { public SessionAttribute(Type type) { Type = type; } public Type Type { get; } } Декорируем нашим атрибутом SessionType: public class FirstSession : Session { public override SessionType SessionType => new FirstSessionType(); } public class SecondSession : Session { public override SessionType SessionType => new SecondSessionType(); } [Session(typeof(FirstSession))] public class FirstSessionType : SessionType { } [Session(typeof(SecondSession))] public class SecondSessionType : SessionType { } После этого можно создать экземпляр Session зная SessionType: public static Session CreateInstanceOfSession(Type sessionType) { var attr = sessionType.GetCustomAttribute(typeof(SessionAttribute)) as SessionAttribute; if (attr != null) { return (Session)Activator.CreateInstance(attr.Type); } return null; } Проверяем: Console.WriteLine(CreateInstanceOfSession(typeof(FirstSessionType)).ToString()); //Выведет FirstSession Console.WriteLine(CreateInstanceOfSession(typeof(SecondSessionType)).ToString()); //Выведет SecondSession

Ответ 2



Большое спасибо за ответы. Оба ответа мне помогли. Решил задачу немного другим способом, отличным от обоих предложенных. Точнее, соединил их в одно решение. Идея: Для каждого класса-потомка устанавливается атрибут. Потом сканируем потомков и определяем по атрибуту нужный тип Создаем экземпляр. Реализация: using System; using System.Linq; using System.Reflection; namespace TestAttrib { public enum SessionType { One , Two } public abstract class Session { public abstract SessionType SessionType { get; } public static Session construct(SessionType sessionType) { Type typeSession = typeof(Session); Type type = Assembly.GetAssembly(typeSession).GetTypes().SingleOrDefault(t => t.IsSubclassOf(typeSession) && (t.GetCustomAttribute(typeof(SessionTypeAttribute)) as SessionTypeAttribute).SessionType == sessionType ); if (type != null) { return (Session)Activator.CreateInstance(type); } return null; } } [SessionType(SessionType.One)] public class Session_One : Session { public override SessionType SessionType => SessionType.One; } [SessionType(SessionType.Two)] public class Session_Two : Session { public override SessionType SessionType => SessionType.Two; } [AttributeUsage(AttributeTargets.Class)] public class SessionTypeAttribute : Attribute { public SessionTypeAttribute(SessionType sessionType) { SessionType = sessionType; } public SessionType SessionType { get; } } class Program { static void Main(string[] args) { Console.WriteLine(Session.construct(SessionType.One).ToString()); //Выведет TestAttrib.Session_One Console.WriteLine(Session.construct(SessionType.Two).ToString()); //Выведет TestAttrib.Session_Two Console.ReadLine(); } } }

Ответ 3



Нет, "более простым" способом это сделать нельзя. Но можно сделать более сложным. Вы можете просканировать все ассембли процесса и собрать все типы, которые являются неабстрактными потомками Session. Потом создав инстанс каждого из этих типов и вызвав у него SessionType, заполните лукап таблицу для нахождения типа потомка Session по значению SessionType.

Как лучше всего проверить, что окно существует?

#c_sharp #windows #visual_studio #winapi


Допустим, я пишу функцию, которая по значению дескриптора должна вернуть логическое
значение, существует ли окно с таким дескриптором. Я представляю огромное количество
реализаций - от перебора всех окон через GetProcesses или EnumWindow и до вызова какой-нибудь
функции, принимающей hwnd, и возвращающую результат. А может я все усложняю, а такая
функция входит в user32. В общем, как будет лучше и быстрее?
    


Ответы

Ответ 1



Есть WinApi функция IsWindow, но как пишут в этом ответе хендл может переназначаться => если вы пасете определенное окно и хотите проверить его существование, то окно может быть уже закрыто, но хендл с таким же номером был создан для другого окна. [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool IsWindow(IntPtr hWnd); Получается, что имеет смысл воспользоваться вот этой функцией, если у окна есть специфическое название GetWindowText , она вернет Caption окна и можно удостоверится, что именно желаемое окно живо. Через WinApi я думаю, что быстрее. Что лучше? Все зависит от того, как часто вы это собираетесь делать. Если не часто, то я бы не заморачивался и выполнял итерацию по процессам.

Android Studio засунуть сайт в приложение

#java #android #android_studio


Всем привет, подскажите как засунуть сайт в приложение ? к примеру как тут http://www.appsgeyser.com/create-url-app/
где об этом почитать можно ? или пример, курс
    


Ответы

Ответ 1



Если вы имеете в виду отображение какого-то сайта в вашем приложении, то для этого есть элемент WebView 1) В разметке добавляете: 2) В коде для загрузки требуемого сайта используете следующее: WebView webView = findViewById(R.id.web_view); webView.loadUrl("https://ru.stackoverflow.com/");

Как лучше сделать анимацию нескольких монеток, которые уменьшаясь, летят в одну точку?

#android


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

Ответ на комментарий:


Я до сих пор новичок, и использую только ConstraintLayout, после уроков так повелось.
Мне надо переделать все на Relative?  
Мне не нужно наследовать ваш класс от AppCompatActivity, только провести нужные импорты? 
Параметр paddings в R.dimen.paddings подсвечен красным. 
Вот с этой строчкой запутался.
((тип parent startView)startView.getParent).removeView (startView); 


Изменил ее так:

((ImageView)startView.getParent()).removeView(startView);

но теперь removeView() красный.


При имплементации класса, мой главный класс требует обьявить абстрактным или имплементировать
абстрактный метод AnimationEnd(int)

    


Ответы

Ответ 1



Использую для подобных целей (в моем случае - "летят" очки) класс ниже. Использование: где надо для каждой кучки создавайте его экземпляр и передавайте контекст, RelativeLayout (да, надо чтобы корневой View activity был RelativeLayout. Можно FrameLayout), изображение, с которого начинается движение (ваша кучка, где бы она не была), изображение сундука (куда полетят деньги)), количество, которое "долетит" (сумма денег). public class AnimateScore { private static final int ANIMATION_DURATION = 400; private View targetView; private int offset, number; private AnimationEnd animationEnd; private ImageView img; private RelativeLayout container; interface AnimationEnd { void animationEnd(int number); } AnimateScore(Context ctx, RelativeLayout container, View startView, View targetView, int number) { animationEnd = (AnimationEnd) ctx; this.number = number; int dimens = (int) ctx.getResources().getDimension(R.dimen.paddings); offset = (int) (-24 * ctx.getResources().getDisplayMetrics().density); this.container = container; this.targetView = targetView; img = new ImageView(ctx); int[] coords = {getRelativeLeft(startView), getRelativeTop(startView)}; String str = "+" + String.valueOf(number); img.setImageResourse(R.drawable.my_img) img.setPadding(dimens, dimens, dimens, dimens); img.setX(coords[0] + dimens * 2); img.setY(coords[1]); ((тип parent startView)startView.getParent).removeView (startView); container.addView(img); img.postDelayed(new Runnable() { @Override public void run() { drawAnimation(img); } }, 10); } private void drawAnimation(View v1) { v1.clearAnimation(); ScaleAnimation animation = new ScaleAnimation (1, 0,1,0); animation.setDuration(ANIMATION_DURATION + 100); animation.setFillAfter(true); v1.setAnimation(animation); v1.startAnimation(animation); v1.animate().translationX(getRelativeLeft(targetView)) .translationY(getRelativeTop(targetView) + offset).setDuration(ANIMATION_DURATION) .setInterpolator(new DecelerateInterpolator()).setListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { container.removeView(img); animationEnd.animationEnd(number); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); } private int getRelativeLeft(View myView) { if (myView.getParent() == myView.getRootView()) return myView.getLeft(); else return myView.getLeft() + getRelativeLeft((View) myView.getParent()); } private int getRelativeTop(View myView) { if (myView.getParent() == myView.getRootView()) return myView.getTop(); else return myView.getTop() + getRelativeTop((View) myView.getParent()); } } offset - для корректной работы (не знаю откуда смещение, но так) dimens*2 - чтобы учитывать два родительских padding в классе-приёмнике не забудьте implements AnimateScore.AnimationEnd немного адаптировал класс под ответ, если что-то не работает или есть вопрос - пишите в комментариях ;) Раз: Два: нет, просто в нужный момент вызывайте экземпляр: new AnimateScore (YourActivity.this, findViewById(R.id.globalcont),your_coin_pile_img,your_chest_img, 100) Три: это отступы, прописанные у меня в dimen. Это можно удалить либо подвести туда курсор, нажать alt+enter и ввести значение (обычно 5-10-15dp). Либо прописать в dimen в ручную. Четвере: "тип parent" - тип контейнера в котором лежит ваша "кучка золота" (LinearLayout, FrameLayout, ConstrainLayout и т.д.) Пять: имплементируйте :) (alt+enter, когда курсор на красном). Необязательная часть, можете удалить вместе с interface. Нужна, для того, чтобы отслеживать, когда анимация "дошла" и, например, только тогда добавлять монеты в сундук.

Можно ли отключить в строках с “логами” дату и время?

#android #android_studio


В окне Logcat хотелось бы видеть только сообщения "логов", без даты и времени.
Можно ли это сделать?
    


Ответы

Ответ 1



Можно. Нажмите там слева на шестерёнку (в 3.1. В предыдущих версиях кнопка может быть в другом месте, да и выглядеть по-другому) и уберите галочку с "дата/время".

Linq удалить диапазон по id

#c_sharp #entity_framework #linq


Как написать запрос удаления диапазона по списку id, без создания сущностей которые
требуются в RemoveRange?
    


Ответы

Ответ 1



Если работаете с БД через Энтити, то мое решение не подойдет. Давайте вдарим по функциональщине - не будем удалять ничего из исходной коллекции, а просто заместим ее новой коллекцией без ненужных элементов: var range = new List {1, 2, 3, 3, 4, 5, 6, 78, 8}; //идэшники которые нужно удалить //коллекция из которой будем удалять, если вы под id имели в виду индекс элемента var collection = Enumerable.Range(0, 100).ToList(); //здесь мы просто создаем коллекцию, у вас она уже есть collection = collection.Where((x,i)=> !range.Contains(i)).ToList(); //а вот самая мякотка здесь //в случае если id - это поле некоторого объекта коллекции которую //мы хотим почистить var collection2 = Enumerable.Range(0, 100) .Select(x=> new {Id = x, Value=x*10}) .ToList(); // то будет так: collection2 = collection2.Where(x => !range.Contains(x.Id)).ToList(); В случае Entity Framework вроде иного способа нет: db.SomeTable.RemoveRange(db.SomeTable.Where(r => IDs.Contains(r.ID))); По идеи объекты в параметрах не создаются - просто все дерево транслируется в SQL - так что не надо беспокоится на этот счет.

Ответ 2



Решил вопрос таким образом (через фейковые объекты): public async Task DeleteUsersByIdAsync(IEnumerable id_users) { using (REMOTE_OFFICE_3Entities db = new REMOTE_OFFICE_3Entities()) { IEnumerable delete_users = id_users .Select(selector: id => new User { id = id }) .Select(selector: read => db.Users.Attach(entity: read)); db.Users.RemoveRange(entities: delete_users); await db.SaveChangesAsync(); } }

Как убрать “Г.” в JavsScript

#javascript #дата


Здравствуйте, у меня возникла некая проблемка, нужно убрать "Г." при выводе даты в js.

function getLocalYearMonth(d) {
    return d.toLocaleDateString(locale, {
        year: '2-digit',
        month: 'long'
    });
}
var nDate = new Date(year, month, 1);
var title = document.getElementById('c-title');
    title.innerHTML = getLocalYearMonth(nDate);


При выводе получается примерно так: "Апрель 18Г.", мне нужно чтобы выводило просто
"Апрель 18".
    


Ответы

Ответ 1



Кроме двух вариантов костыля ничего в голову не приходит. А заглавную букву можно потом сделать в css при помощи text-transform: capitalize. function getLocalYearMonth(d) { return d.toLocaleDateString("ru-RU", { month: 'long' }) + " " + d.toLocaleDateString("ru-RU", { year: '2-digit' }); } var nDate = new Date(); console.log(getLocalYearMonth(nDate)); function getLocalYearMonth(d) { return d.toLocaleDateString("ru-RU", { month: 'long', year: '2-digit' }) .replace(/\s*г\./, ""); } var nDate = new Date(); console.log(getLocalYearMonth(nDate));

Ответ 2



Просто slice(0, -3). Вернет строку с "отрезанными" тремя последними символами (в данном случае "_г.") function getLocalYearMonth(d) { return d.toLocaleDateString('ru-RU', { year: '2-digit', month: 'long' }).slice(0, -3); } console.log(getLocalYearMonth(new Date())); Варианты с капитализацией строки: function getLocalYearMonth(d) { let result = d.toLocaleDateString('ru-RU', { year: '2-digit', month: 'long' }); return result.charAt(0).toUpperCase() + result.slice(1, -3); } console.log(getLocalYearMonth(new Date())); function getLocalYearMonth(d) { let result = d.toLocaleDateString('ru-RU', { year: '2-digit', month: 'long' }).slice(0, -3); return result.charAt(0).toUpperCase() + result.slice(1); } console.log(getLocalYearMonth(new Date())); function getLocalYearMonth(d) { let result = d.toLocaleDateString('ru-RU', { year: '2-digit', month: 'long' }).split(''); result[0] = result[0].toUpperCase(); return result.slice(0, -3).join(''); } console.log(getLocalYearMonth(new Date())); Рекомендую первый.

Как взаимодействовать с API Telegram в обход блокировки?

#telegram_bot #telegram_api #telegram


Начал писать Telegram бота.
Сразу столкнулся с проблемой, что не могу получить ответ (видимо из-за блокировки РКН)

Попробовал прокси - не помогло - или я что-то не так настроил....



Есть ли сейчас способы обойти блокировку и написать Telegram бота? 
    


Ответы

Ответ 1



Для обхода блокировки, нужно подключаться к SOCKS5 прокси: /*** PHP CODE ***/ /****************/ $prxy = 'http://94.130.223.179:1080'; // адрес:порт прокси $prxy_auth = 'auth_user:auth_pass'; // логин:пароль для аутентификации /****************/ $ch = curl_init(); $url = "https://api.telegram.org/botXXXXX/sendMessage?chat_id=XXXXX&text=XXXXX"; // где XXXXX - ваши значения curl_setopt_array ($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true)); /********************* Код для подключения к прокси *********************/ curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); // тип прокси curl_setopt($ch, CURLOPT_PROXY, $prxy); // ip, port прокси curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxy_auth); // авторизация на прокси curl_setopt($ch, CURLOPT_HEADER, false); // отключение передачи заголовков в запросе curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возврат результата в качестве строки curl_setopt($ch, CURLOPT_POST, 1); // использование простого HTTP POST curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // отмена проверки сертификата удаленным сервером /***********************************************************************/ $result = curl_exec($ch); // DIGITAL RESISTANCE! curl_close($ch); Не забудьте подставить рабочий прокси адрес ($prxy) и, если необходимо, данные для аутентификации ($prxy_auth), а также свой запрос ($url)

Как нарисовать треугольник по трём сторонам?

#javascript #canvas


У меня будет 3 интупа и баттон. При нажатии на этот батон должен нарисоваться треугольник
у которого 3 стороны равны значениям в инпутах. Как это организовать? Нагуглил 

context.beginPath();
            context.moveTo(30, 20);
            context.lineTo(some_value);
            context.lineTo(some_value);
            context.closePath();


Но этот способ подходит для рисования, по двум сторонам.
    


Ответы

Ответ 1



Вам надо найти координаты вершин и соединить их отрезками. Пусть одна сторона (например, A) лежит вдоль оси 0X. Тогда её Y-координата будет равна 0. А значит и двух вершин треугольника тоже. Остаётся найти ещё одну вершину и соединить её с концами этого отрезка A. Я бы для начала нашёл углы треугольника. Это можно сделать из двух разных формул поиска площади треугольника: по формуле Герона и зная, что площадь равна произведению длин двух сторон на синус угла между ними. После этого можно опустить высоту из вершины, координаты которой ищем, и внутри прямоугольного треугольника легко найдём x- и y-компоненты координаты. btn.onclick = () => { let A = 1 * a.value, B = 1 * b.value, C = 1 * c.value; let p = (A + B + C) / 2; let S = Math.sqrt(p * (p - A) * (p - B) * (p - C)); let SinA = 2 * S / (A * B); let alpha = Math.asin(SinA); let x = B * Math.cos(alpha), y = B * Math.sin(alpha); let ctx = img.getContext("2d"); ctx.beginPath(); ctx.moveTo(10 + A, 70); ctx.lineTo(10, 70); ctx.lineTo(10 + x, 70 - y); ctx.lineTo(10 + A, 70); ctx.stroke(); }



Матчасть: Как найти углы треугольника по трем его сторонам

Ответ 2



Вам нужно будет сначала вычислить координаты каждой точки. Вы можете установить первую точку на [0, 0], а вторая будет на [x1, 0], где x1 - длина первой строки. Третью точку можно рассчитать так: var AB = 40; var BC = 50; var AC = 30; var A = [0, 0]; // начальные координаты var B = [0, AB]; var C = []; // вычисление третьей точки C[1] = (AB * AB + AC * AC - BC * BC) / (2 * AB); C[0] = Math.sqrt(AC * AC - C[1] * C[1]); var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.moveTo(A[0], A[1]); ctx.lineTo(B[0], B[1]); ctx.lineTo(C[0], C[1]); ctx.fill();

Что происходит с памятью при вызове exec() на уровне ядра?

#linux #процесс


Вопрос теоретический. fork() делает копию процесса. Известно, что родительский процесс
имеет собственное адресное пространство. Дочерний процесс, фактически, до какого-то
момента может работать с адресным пространством своего родителя. Этот момент - запись
в адресное пространство. Таким образом дочерний процесс в режиме "только чтение" может
в полной мере руководствоваться родительским адресным пространством. Если производится
запись, то адресное пространство копируется (copy-on-write [COW]). Возникает несколько
вопросов: 


Что будет со скопированным адресным пространством, если будет вызван exec()?
Если после fork() вызвать exec(), то новый исполняемый код создает свое собственное
адресное пространство? 
Что будет с таблицей страниц дочернего процесса после вызова exec()?

    


Ответы

Ответ 1



Рассматривать что происходит с памятью при вызове exec() в отрыве от остальной подсистемой управления пямятью — неполноценно и описать этот процесс можно только в общих словах. А по всей данной подсистеме можно написать целую книгу (и несколько уже написаны), но я всё же попытаюсь выделить основные моменты. Немного о структурах связанных с управлением памятью процесса Кратко опишу назначение основных структур связанных с управлением памятью процесса. Структуры связанные с управлением виртуальным АП. task_struct — дескриптор процесса mm_struct — адресное пространство процесса vm_area_struct — отдельный сегмент памяти процесса со своим набором атрибутов (rwx), можно думать о нём как о неком регионе отображённом в память mmap ()'ом: он может быть и частью файла (исполняемого или обычного) и простым анонимным участком памяти. Список можно посмотреть, например в /proc//maps. Структуры связанные с трансляцией адресов и физической памятью: pgd_t и pmd_t (а также p4d и pud) — системно-зависимые типы для записей в глобальной директории страниц (Page Global Directory) и промежуточной директории страниц (Page Middle Directory), если таковая есть (на простом x86 таковой нет). p4d и pud — это дополнительные типы в новых ядрах для пятиуровневой и четырёхуровневой адресации. pte_t — системно-зависимый тип Записи в таблице страниц (Page Table Entries). На x86 это, как и pgd_t 32-битный тип с аналогичным названием. struct page — системно-независимая структура представляющая страницу физической памяти. Все они постоянно хранятся в памяти в массиве mem_map. Если кратко, то эти структуры взаимосвязаны следующим образом: task_struct.mm ссылается на mm_struct, связанный с процессом. На один mm_struct может ссылаться несколько task_struct (так в частности реализованы потоки) mm_struct.mmap в свою очередь ссылается на двусвязный список vm_area_struct, связанных с процессом. mm_struct.pgd хранит адрес глобальной директории страниц pgd_t связанной с процессом. На x86 он фактически загружается в CR3 при смене контекста. vm_area_struct.mm — указатель на mm_struct к которому принадлежит данный сегмент. vm_area_struct.next и vm_area_struct.prev — указатели на предыдущий и следующий элемент в двусвязном списке. Для pte_t и pgd_t можно получить соответствующую структуру struct page с помощью макросов и pte_page() и pgd_page() соответственно. Немного о том, как работает COW При создании нового процесса fork ()'ом цикл проходится по всем связанным с ним vm_area_struct и помечает все доступные на запись страницы (pte_t), доступными только на чтение. А в соответствующей struct page увеличивается счётчик ссылок на страницу. Когда процесс пытается записать в такую страницу, происходит прерывание, далее обработчик (спустившись на несколько функций по стеку вызовов) определяет, что хотя прерывание произошло на странице на которой запрещена запись (согласно pte_t), эта страница относится к сегменту, в котором она разрешена (согласно vm_area_struct). Таким образом определяется, что это одна из COW-страниц и происходит копирование. После чего уменьшается счётчик ссылок исходной страницы (в struct page) и, если он достиг нуля, снова разрешается запись в неё. Что происходит с адресным пространством при execve() Сначала exec() создаёт новое АП (mm_struct) частично его инициализирует (например создаёт стек), А потом пробует подсунуть файл поочерёдно каждому из модулей поддержки форматов (например ELF) пока один из них не сможет его загрузить. Модуль в свою очередь сначала проводит частичную проверку формата и также частичную инициализацию АП, а затем, когда убедится, что формат выбран правильно и скорей всего удастся загрузить данный файл, происходит подмена старого АП новым и последующая подчистка старого. В частности она включает: Уменьшение количества пользователей АП (mm_struct.users), если оно достигло нуля, то: В цикле обходятся все vm_area_struct и для каждой происходит рекурсивная итерация по каталогу страниц в результате счётчики ссылок всех ассоциированных страниц (struct page) уменьшаются аналогично тому как это было описано для COW. После этого в другом цикле обходятся все vm_area_struct и записываются несохранённые данные из грязных страниц mmap-файлов. Уменьшается количество ссылок на АП (mm_struct.count) и если оно достигло нуля (кроме процессов структура может использоваться другими подсистемами ядра), то она полностью удаляется. В случае успешного завершения модуль формата продолжит инициализацию АП, а затем произойдёт передача управления процессу. Стоит заметить, что операция подмены АП(вызов flush_old_exec()) — это точка невозвращения, т.е. после оной exec () уже не сможет вернуть одну из документированных ошибок; и в случае сбоя весь процесс будет аварийно завершён по сигналу, например, SIGSEGV. Односложные ответы на конкретные вопросы Что будет со скопированным адресным пространством, если будет вызван exec()? Оно будет замещено другим, созданным exec (). Если после fork() вызвать exec(), то новый исполняемый код создает свое собственное адресное пространство? Да. Что будет с таблицей страниц дочернего процесса после вызова exec()? Она также будет замещена новой. Страницы не используемые другими будут добавлены в список свободных. Дальнейшее чтение: Understanding The Linux Virtual Memory Manager — Книга описывает довольно старое ядро, но отличия в основном косметические, а основные принципы не изменились.

Почему не работает js код на IE любой версии?

#javascript #internet_explorer


Почему не работает js код на IE любой версии? 





Код:

var titleSearch = `
    

Поиск `+ quantityProduct +`

`;


Ответы

Ответ 1



P.S. Решил сделать вопрос-ответ по причине того, что на поиски ответа убил порядком нескольких дней (а потом еще пару дней менял все на кавычки), надеюсь кому-либо это будет полезно. (Если есть другое решение, буду рад ответам в комментарии). IE не поддерживает шаблонные строки ``. Весь код, который содержит в себе подобные символы `, придется переписать на кавычки и конкатенацию (сложение, пример: "Hello" + "world!"). Решение: var titleSearch = '
' + '
' + '
' + '

Поиск (Всего 1 товар)

' + '
' + '
' + '
';

Почему не работает js код?

#javascript #массивы


Есть функция, которая должна переворачивать массив (как метод reverse):



function reversed(arr) {
  for (var i = arr.length; i > 0; i--) {
    var elem = arr.pop();
    arr.unshift(elem);
  }
  return arr;
}

var testArr = [1, 2, 3, 4, 5, 6, 7, 8];

console.log(reversed(testArr));




Но возвращается исходный массив
    


Ответы

Ответ 1



Ошибка логики - всё равно что пытаться перевернуть стопку, каждый раз беря сверху и подкладывая снизу. function reversed(arr) { for (var reversed = []; arr.length > 0; reversed.push(arr.pop())); return reversed; } var testArr = [1, 2, 3, 4, 5, 6, 7, 8]; console.log(reversed(testArr));

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

#javascript #html #jquery #css


Сначала у нас ряд нулей, затем на месте нулей происходит мелькание других цифр, после
чего все позиции занимаются определёнными цифрами.
 Каким образом можно реализовать подобное, посредством CSS, jQuery, ... ?
 У меня 8 таких ячеек, в каждой будет своё число. Думал написать код замены значений
(ряд замен для реализации мелькающих значений, после чего - финальная замена), но что-то
не видел такого механизма в пособии по jQuery. Может его и нет ?
В общем, мне нужна, прежде всего, концепция. Если есть решение - вообще супер.
    


Ответы

Ответ 1



function runTest(){ var counter = 0; var timer = setInterval(function(){ $(".display").css("color", "red").text(Math.floor(Math.random() * 100)); counter++; if (counter > 40) { clearInterval(timer); $(".display").css("color", "green").text(999); } }, 30); } .display{ display:inline-block; border: solid 1px black; padding:5px; margin:5px; font-size:25px; width:50px; text-align:center; }
 



Как добавить ссылку внутри круга SVG

#javascript #html #css #svg #анимация


Я нарисовал круг, используя svg. Этот круг имеет эффект :hover.
Я хотел бы добавить ссылку внутри круга и для текста ссылки изменить цвет при наведении
курсора. 

Ниже мой код:   



svg#circle {
  height: 250px;
  width: 250px;
}

circle {
  stroke-dasharray: 700;
  stroke-dashoffset: 700;
  stroke-linecap: butt;
  -webkit-transition: all 2s ease-out;
  -moz-transition: all 2s ease-out;
  -ms-transition: all 2s ease-out;
  -o-transition: all 2s ease-out;
  transition: all 2s ease-out;
}

circle:hover {
  fill: pink;
  stroke-dashoffset: 0;
  stroke-dasharray: 700;
  stroke-width: 10;
}

    
 



    


Ответы

Ответ 1



Вам нужно добавить элемент, завернутый в ссылку . Обратите внимание, что элемент, находящийся поверх круга, заблокирует действие наведения на тексте в круге. Поэтому я обернул все это в группу и сделал :hover на группу. svg#circle { height: 250px; width: 250px; } g circle { stroke-dasharray: 700; stroke-dashoffset: 700; stroke-linecap: butt; -webkit-transition: all 2s ease-out; -moz-transition: all 2s ease-out; -ms-transition: all 2s ease-out; -o-transition: all 2s ease-out; transition: all 2s ease-out; } g:hover circle { fill: pink; stroke-dashoffset: 0; stroke-dasharray: 700; stroke-width: 10; } text { fill: pink; font-size: 24px; } a:hover text { fill: blue; } google Источник: How to add a link inside an svg circle @Paulie_D

Ответ 2



Ответ с динамическим добавлением ссылки Я думаю, что это сработает: Динамическое добавление ссылки на SVG Circle с помощью JS function addAnchor(){ var dummyElement = document.createElement("div"); dummyElement.innerHTML = '
'; var htmlAnchorElement = dummyElement.querySelector("a"); var circleSVG = document.getElementById("circle"); htmlAnchorElement.innerHTML = circleSVG.innerHTML; circleSVG.innerHTML = dummyElement.innerHTML; } Источник: How to add a link inside an svg circle @Jyothi Babu Araja