Страницы

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

вторник, 16 апреля 2019 г.

Ошибка: pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 5, saw 9

Пытаюсь зугрузить tsv–файл в pandas.
import pandas as pd df = pd.read_csv(filename, sep='\t') print(df)
После выполнения этого кода в консоли вижу ошибку
df = pd.read_csv(filename, sep='\t') File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/io/parsers.py", line 655, in parser_f return _read(filepath_or_buffer, kwds) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/io/parsers.py", line 411, in _read data = parser.read(nrows) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/io/parsers.py", line 982, in read ret = self._engine.read(nrows) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/io/parsers.py", line 1719, in read data = self._reader.read(nrows) File "pandas/_libs/parsers.pyx", line 890, in pandas._libs.parsers.TextReader.read (pandas/_libs/parsers.c:10862) File "pandas/_libs/parsers.pyx", line 912, in pandas._libs.parsers.TextReader._read_low_memory (pandas/_libs/parsers.c:11138) File "pandas/_libs/parsers.pyx", line 966, in pandas._libs.parsers.TextReader._read_rows (pandas/_libs/parsers.c:11884) File "pandas/_libs/parsers.pyx", line 953, in pandas._libs.parsers.TextReader._tokenize_rows (pandas/_libs/parsers.c:11755) File "pandas/_libs/parsers.pyx", line 2184, in pandas._libs.parsers.raise_parser_error (pandas/_libs/parsers.c:28765) pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 5, saw 9
Подскажите, в чем может быть проблема?


Ответ

Обычно эта ошибка говорит о том, что CSV/TSV файл "поломан", т.е. не является корректным CSV/TSV файлом. Иногда это случается, когда некоторые программы пишут в заголовок CSV/TSV файла техническую информацию или описание. В этом случае часто используют символ комментирования, например # в начале строки.
Pandas умеет игнорировать закомментированные строки:
pd.read_csv(filename, sep='\t', comment='#')

Java пакеты, как их правильно представить и понять, что в них отсутствует иерархия

Написав это import java.awt.*; я не получу, содержимое этого import java.awt.event.*; Хотя казалось бы должен получить, если учитывать, что существует иерархия пакетов. Вроде всё расфасовано по пакетам, в одном пакете, есть еще вложенные пакеты. Но получив доступ к пакету в котором, есть вложенные, я не получаю содержимого вложенных пакетов. Хочется понять, это получается из-за какого-то особого подхода к структурированию пакетов или же они действительно находятся в иерархической расположенности, но система не дает доступа к вложенным пакетам, если запрошен главный пакет? import java.awt.*; даст мне содержимое import java.awt.event;(заметьте звездочки нет во втором импорте) ? Или же event это тоже пакет, а import java.awt.*; даст мне все классы на этом уровне, но не пакеты? Выходит как в виндовс: применил, что то к папке, а там вопрос : применить к вложенным папкам? Вроде бы иерархия есть, но влияние на неё контролируется.


Ответ

Java рассматривает каждый пакет как независимый. Например, локальные пакеты не распространяются на любые «под»пакеты. Я подозреваю, что использование иерархии значимым образом было бы ценным, но дизайн Java должен был сделать все максимально простым.
Java не рассматривает пакеты как действительно подклассифицирующие друг друга; в то время как java.util и java.util.concurrency могут выглядеть так, как будто вторая часть является частью первой, однако они рассматриваются как полностью независимые, а точка в основном используется для аккуратности.
Причины этого решения, скорее всего, проистекают из общей тенденции Java к простоте. Лучшая практика часто никогда не использовать подстановочные символы импорта вообще.

Согласно спецификации JLS, Section 7.5, возможны только 4 способа произвести импорт:
A single-type-import declaration (§7.5.1) imports a single named type, by mentioning its canonical name (§6.7).
Одиночный импорт по его «каноническому» имени.
Например: import java.util.List;
A type-import-on-demand declaration (§7.5.2) imports all the accessible types (§6.6) of a named type or named package as needed, by mentioning the canonical name of a type or package.
Импорт всех доступных типов или пакетов по их «каноническому» имени. Это подразумевает, что будут импортированы все имена дочерних пакетов, но не их содержимое.
Например: import java.awt.*;
A single-static-import declaration (§7.5.3) imports all accessible static members with a given name from a type, by giving its canonical name.
Одиночный статический импорт, который импортирует все статические члены пакета.
Например: import static org.junit.Assert.assertEquals;
A static-import-on-demand declaration (§7.5.4) imports all accessible static members of a named type as needed, by mentioning the canonical name of a type.
Импорт всех статических членов пакета.
Например: import static org.junit.Assert.*;
Пакеты позволяют дать одинаковое имя разным классам. Если бы была возможность импортировать с помощью * всю суб-иерархию пакетов, была бы неразбериха в ваших локальных именах классов.

Ассоциация: why doesn't Java have “deep” wildcard import?, Java import all from all

Почему не рекомендуют ставить ключевое слово inline в реализации метода?

Мой коллега увидел, что я ставлю inline методам get и set и в объявлении метода и в реализации и сказал, что так делать не стоит, но аргументировать это не смог. Я тоже когда-то про такое слышал, но информации найти не смог. Я знаю, что компиляторы сейчас забивают даже на форсинлайны и обычный inline им вообще не указ. Но всё-таки, правда ли что inline ставить лучше только в объявлении метода и какие у этого есть объективные причины?


Ответ

Основное назначение слова inline: дать программисту инструмент определять функции так, чтобы у компилятора была возможность встроить их на этапе компиляции и не вызвать в дальнейшем ошибку компоновки.
Вторичное назначение: сообщение другим людям работающим над данным кодом, что автор надеется, что компилятор встроит эту функцию.
Кроме того это действительно является подсказкой компилятору встроить функцию (я сам сомневался в этом), которая на самом деле влияет на эвристики компилятора, например, увеличивая пороговые значения размера функции выше которых компилятор откажется её встраивать (смотри ссылку на статью в ответе @ixSci)
Пусть есть класс Foo с переменной a, к которой нужно обеспечить доступ; есть несколько вариантов, что можно сделать с getA
Определить прямо в классе.
class Foo { int a{0}; public: int Foo::getA () { return a; }
inline подразумевается, программист сразу понимает что к чему, компоновщик не жалуется о повторном определении. ИМХО — это предпочтительный вариант покуда реализация не занимает больше двух-трёх (пяти?) строк. Определить в хедере вне класса.
class Foo { int a{0}; public: int getA (); }
int Foo::getA () { return a;}
Это тот случай, когда использование слова inline обязательно и для чего оно и было введено, но где именно оно будет компилятору всё равно, вопрос исключительно стилистический. Распишу плюсы и минусы на мой взгляд (все они крайне эфемерны):
2.1. inline только в объявлении — назовём это «основным вариантом».
2.2. inline только в определении — относительно плохой вариант:
- При просмотре объявления программист будет рассчитывать, что компилятор не сможет (и не должен) встроить функцию, что для геттера вызывает ряд вопрсов и потенциально ложных предположений, например то что этот геттер не тривиальный и требует каких-то вычислений.
2.3. inline и в объявлении и в определении
+ При прочтении и объявления, и определения класса сразу видно, что функция встраиваемая. - Чревато скатыванием к предыдущему варианту, если кто-то удалит слово inline и не удосужится проверить. Определение в отдельном *.cpp
// foo.h class Foo { int a{0}; public: int getA (); }
// foo.cpp #include "foo.h" int Foo::getA () { return a;}
// main.cpp #include "foo.h" int main(void) { Foo foo; return foo.getA(); }
Если inline будет присутствовать в объявлении или определении, то это нарушение стандарта, который требует, чтобы определение функции объявленной как inline было доступно в каждой единице трансляции, где она вызывается и оно было в точности одинаковое.

Необходимый стек технологий для Data Mining

Занимаюсь активным изучением направления Data Mining и в приложении к нему Python-ом (использую источники: coursera, открытое образование, книги - Доусон, Лутц и т.д.). Основы языка мне уже ясны. Решил для того чтобы как следует разобраться написать приложение для анализа большого объема данных с фондового рынка, как наиболее открытых и очищенных. В простом виде - на истории проблем не составило. Рабочий прототип на VBA тоже реализовал без проблем.
Но по мере усложнения задачи (увеличения объема информации и перехода на обработку поступающих данных в режиме онлайн) столкнулся с тем что не хватает знаний и непонятно в какую сторону копать. Надо изучать библиотеки. Вопрос на каких сосредоточиться (Nympy, matplotlib, pandas?)
Что нужно: Эффективно хранить и обрабатывать временные ряды данных, отрисовывать это все в виде графиков, отрисовывать результаты анализа в виде трех(более?)мерных графиков для поиска вершин, иметь какой-нибудь простецкий UI, принимать информацию от торговой программы (а-ля Quik), которая умеет отдавать данные только по DDE и ODBC (это для меня самая сложная задача сейчас), эффективно хранить полученные данные и результаты промежуточного анализа (сейчас это текстовые файлы - смотрю в сторону MS SQL Server Express).


Ответ

Попробую ответить на некоторые из ваших вопросов.
Загрузка, выгрузка, первичная обработка табличных данных, визуализация - Pandas. Для чтения финансовых данных существует - pandas_datareader Для более сложных графиков может понадобиться matplotlib, seaborn, bokeh, plotly. С визуализацией четырех и более мерных графиков у вас наверняка возникнут трудности - ни одна из известных мне библиотек этого делать не умеет (это как проецировать 3D объект на прямую). хранение данных: тут есть важный момент - если этими данными будут активно пользоваться 3+ пользователей, то стоит задуматься об использовании БД, т.к. там изначально отлично продуманы механизмы совместного доступа к данным и необходимые блокировки при записи. Если для одного пользователя, то можно попробовать HDF5, Feather, Parquet, etc. Кстати Pandas замечательно справляется со всем вышеперечисленным. NOTE: хранить данные в текстовых файлах не стоит - это путь сплошных мучений и проблем. Выбирайте хранилище, которое позовляет хранить нужные вам типы данных нативно - без преобразования в/из текста. дальше можно (и стоит) развиваться в сторону машинного обучения и нейронных сетей - sklearn, tensorflow, keras, theano, etc.

Как сделать чтобы рандом выдавал сначала больше повторяющих чисел?

Как сделать чтобы рандом выдавал сначала больше повторяющих чисел
к примеру 001000111100000110001111110001111110010001110111 и потом через период выдавал больше одинарних
00110001010101001100101101010100111010


Ответ

Вам нужен нестандартный генератор случайных бит, который помнит предыдущий бит, и выдаёт результат, зависимый от него.
Это легко организовать:
class DependentRandomBitGenerator { Random r = new Random(); public double DependencyFactor { get; set; } = 0.5; int prev = 0; public int GetNext() { if (r.NextDouble() < DependencyFactor) prev = 1 - prev; return prev; } }
Проверяем:
var rg = new DependentRandomBitGenerator() { DependencyFactor = 0.2 }; for (int i = 0; i < 25; i++) Console.Write(rg.GetNext()); Console.WriteLine(); rg.DependencyFactor = 0.8; for (int i = 0; i < 25; i++) Console.Write(rg.GetNext()); Console.WriteLine();
Результат:
0000000011111100000000001 0010101011010101010101010
Вы можете, по идее, плавно менять вероятность «сцепки» последовательных бит.

Парсинг сайта metanit

Хочу спарсить сайт metanit.com
Стандартными средствами(пример кода https://github.com/extremecodetv/Html-Parser-Tutorial) не выходит. Просто отдает одну пустую страницу.
Пытался использовать Selenium, но тоже работает через раз, да и способ этот мне не нравится: ради парсинга целый движок браузера загружать.
Может вы знаете способ лучше? И почему не работает обычный System.Net.Http.HttpClient ?


Ответ

Проверил я данный сайт. Получаете вы не пустую страницу как таковую, а ошибку 403, которая гласит:
Access forbidden! You don't have permission to access the requested object. It is either read-protected or not readable by the server.
Из за чего это может быть? Хм, ну по сути это происходит по двум причинам:
Вам заблокировали доступ на сервер (или часть сервера) Сервер имеет некую защиту от автоматизации, которая обычно бывает:
Банальная проверка User-Agent заголовка у запроса. Проверка Cookie Комплексные защиты (CloudFlare например, где используют и то и то сразу (а то и больше...)).
Для начала нам стоит отловить запрос, который мы посылаем при заходе на сервер и по очереди добавлять в наш код все, что необходимо.
Лично я всегда использую подобный код для отправки запросов:
public async Task SendRequest(string url) { string data; var baseAddress = new Uri("https://metanit.com"); var cookieContainer = new CookieContainer(); using (var handler = new HttpClientHandler { CookieContainer = cookieContainer }) using (var client = new HttpClient(handler) { BaseAddress = baseAddress }) { var result = await client.GetAsync(url); data = await result.Content.ReadAsStringAsync(); }
return data; }
И так, пробуем по порядку, попробуем задать другой User-Agent. Для этого нам достаточно добавить подобную строку до получения result переменной:
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17120");
И о чудо, сервер открыл нам доступ!
Если бы сервер требовал от нас Cookie, то стоило бы добавить что то вроде этого до result
cookieContainer.Add(baseAddress, new Cookie("key", "value"));
В общем, экспериментируйте и смотрите что именно отправляет ваш браузер на сервер, тогда будет в разы легче сделать то, что вы хотите.

Как правильно вынести блок кода в поток

В моей программе есть блок кода, отвечающий за открытие новостной статьи и извлечение из неё адреса картинки. Этот блок кода находится в потоке, отвечающем за работу с сетью и получение списка новостей. Когда они работают вместе, та программа сперва загружает всё, и отображает содержимое лишь секунд через 30.
Как правильно реализовать функцию получения адреса картинки используя многопоточность?
Код MainActivity прикреплён ниже:
public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {
MyRecyclerViewAdapter adapter;
public Elements content; public ArrayList newsList = new ArrayList<>();

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
new NewThread().execute(); RecyclerView recyclerView = findViewById(R.id.rv_list); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(linearLayoutManager); adapter = new MyRecyclerViewAdapter(this, newsList); adapter.setClickListener(this); recyclerView.setAdapter(adapter); }
@Override public void onItemClick(View view, int position) { Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show(); }
public class NewThread extends AsyncTask {
String cleaner(String a){ String source = a; String result = ""; ArrayList arr = new ArrayList<>(); arr.add(source);
for(String retrival: source.split(" ")){ arr.add(retrival);
} arr.remove(0); Iterator iterator = arr.iterator(); while (iterator.hasNext()) { String string = iterator.next(); if (string.equals("Россия") || string.equals("Екатеринбург")) { iterator.remove(); }else{ result += string+" "; } } return result; }
String url_interpretator(String src){ String result=""; String interval = "";
char[] morph = src.toCharArray(); morph[0]=' '; morph[1]=' ';
for (char a : morph){ if(a==' '){ continue; }else{ interval=interval+a; } }
result="https://"+interval;
return result; } @Override protected String doInBackground(String... arg) { Document doc; String newsText, newsDate, newsTime, newsPicURL, newsLink;
try{ doc= Jsoup.connect("https://www.znak.com/?&%D0%B5%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B1%D1%83%D1%80%D0%B3%20%D0%BC%D1%83%D0%B7%D0%B5").get(); content = doc.select(".pub");
int link_counter = 0; newsList.clear(); for(Element contents: content){



String linkID = doc.getElementsByClass("pub").get(link_counter).attr("href"); String region = doc.getElementsByClass("region").get(link_counter).text(); String time = doc.getElementsByTag("time").get(link_counter).attr("datetime");


// Document doc2 = Jsoup.connect("https://www.znak.com"+href).get(); // String pic_url=url_interpretator(doc2.getElementsByTag("img").get(1).attr("src"));
DateAndTime dat = new DateAndTime(time); newsText=" "+cleaner(contents.text()); newsDate=" "+dat.getYear()+" "; newsTime=dat.getTime();
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Document doc2 = null; //вынести в поток try { doc2 = Jsoup.connect("https://www.znak.com" + linkID).get(); } catch (IOException e) { e.printStackTrace(); } String pic_url = url_interpretator(doc2.getElementsByTag("img").get(1).attr("src")); String readyURL = pic_url; Log.d("picture", contents.text() + " " + pic_url); newsPicURL=readyURL; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
newsLink="https://znak.com"+linkID; NewsElement newsElement = new NewsElement( newsText, newsDate, newsTime, newsPicURL, newsLink); newsList.add(newsElement);

link_counter++; }
}catch (IOException e){
e.printStackTrace(); }
return null; }
@Override protected void onPostExecute(String result) { adapter.notifyDataSetChanged(); }
}
private class DateAndTime{
private String date; private String year; private String time=""; private char[] timeArr;
DateAndTime(String date){ this.date=date; }
String getYear(){
String[] dateAndTime = date.split("T"); String[] dateArr = dateAndTime[0].split("-");
timeArr = dateAndTime[1].toCharArray(); year = dateArr[2]+"."+dateArr[1]+"."+dateArr[0];
return year;
}
String getTime(){
for(int i = 0; i String intTime = String.valueOf(timeArr[0])+String.valueOf(timeArr[1]); int timeValue = Integer.valueOf(intTime)+5;
if(timeValue>23){ timeValue=timeValue-24; String time = "0"+String.valueOf(timeValue)+timeArr[2]+timeArr[3]+timeArr[4]; return time; }else{ String time = String.valueOf(timeValue)+timeArr[2]+timeArr[3]+timeArr[4]; return time; }
} }
}


Ответ

Попробуйте уведомлять адаптер не по окончании разбора всех новостей, а после добавления в список каждой:
public class NewThread extends AsyncTask { // ---------------------
protected String doInBackground(String... arg) { // ----------------------
for(Element contents: content){ // ----------------------
newsList.add(newsElement); publishProgress();
// --------------------- }
@Override protected void onProgressUpdate(Void... values) { adapter.notifyDataSetChanged(); }

Как назвать пакет в android studio?

Насколько я понял, имя пакета - это адрес моего сайта наоборот. Но что мне делать если у меня нет сайта?


Ответ

Нету такого правила. Исторически ноги растут отсюда
Главное, чтоб application id был уникальным. Как правило, это что-то такое com.companyname.applicationname.
Это никак с сайтом не связано. Просто так уж сложилось, что, к примеру, у тех же Adobe сайт https://www.adobe.com, поэтому application id у, например, ридера - com.adobe.reader

Ошибка при обращении к элементу массива

При запуске программы
class Program { static void Main() { string[] listNames = new string[4] { "Личный", "Рабочий", "Семейный", "Список книг" }; TodoList[] TodoLists = new TodoList[listNames.Length]; for (int i = 0; i < TodoLists.Length; i++) { TodoLists[i].name = listNames[i]; } } }
class TodoList { public string name; public string[] tasks; }
получаю ошибку
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. at dz.Program.Main(String[] args) in C:\Users\Yuri\source
epos\dz\dz\Program.cs:line 15


Ответ

TodoList[] TodoLists = new TodoList[listNames.Length] лишь создаёт массив на listNames.Length элементов, в каждой ячейке которого лежит null
Вам сначала нужно проинициализировать элементы массива, чтобы с ними работать.
TodoList[] TodoLists = new TodoList[listNames.Length]; for (int i = 0; i < TodoLists.Length; i++) { TodoLists[i] = new TodoList(); TodoLists[i].name = listNames[i]; }

Значение this при вызове функции через setTimeout

function f() { 'use strict'; alert(this); } f(); // выводится undefined setTimeout(f, 0); // выводится [object Window]
Т. е. при вызове функции через setTimeout игнорируется 'use strict'. Почему?


Ответ

данное поведение документировано
Проблема с "this" Когда вы передаете метод в setTimeout() (или любую другую функцию), то он будет выполнен со значением this, которое может отличаться от того, которое вы ожидаете. Более подробно эта проблема объясняется в руководстве. Объяснение Код, исполняемый в setTimeout(), имеет другой контекст выполнения, нежели функция, вызвавшая setTimeout. Для установки значения this вызываемой функции применяются обычные правила, и если вы не установили значение this при вызове или, используя bind, то значением по умолчанию в non-strict режиме будет объект global (или window), а в strict-режиме значение undefined. Оно не будет таким же как значение this функции, вызвавшей setTimeout Замечание: Значение this по умолчанию в callback-методе, вызванном в setTimeout, все равно будет иметь значение window, а не undefined, даже при использовании strict mode

Рекламный вирус в Windows 8 не дает скачать/запустить антивирус

У меня в комп скачались обычные рекламные вирусы. Сейчас хочу удалить их с программой advcleaner, но как только пишу ее название в гугле, автоматически закрывает браузер. Скачал через телефон, переместил в ПК, как только открываю - сразу закрывает. Что можно сделать?


Ответ

Вижу три направления решения.
Загрузиться в безопасном режиме и запустить антивирус. Использовать другой антивирус (возможно какой-то сможет справиться с заразой). Скачать загрузочный диск с антивирусом и через загрузку с него удалить вирус.
Ну и напоследок скажу, что лучше не доводить компьютер до вирусов и заранее до возможного появления вируса поставить антивирус. Сейчас есть бесплатные версии, например Avast Free или Kasperskiy Free.

Мигает картинка при использовании blur

При наведении курсора на картинку, добавляется с помощью JS class .active
В стиле active указано, что картинка должно стать blur(10px) и transform: translateY(20px);
Анимация active выполняется отлично, но если мы захотим убрать active, чтобы вернуть обычное состояние, то картинка мигает перед концом анимации...
Как можно исправить?


Ответ

Сниппет для воспроизведения проблемы:
for (let img of document.querySelectorAll('.test')) { img.addEventListener('mouseenter', function () { this.classList.add('active'); }); img.addEventListener('mouseleave', function () { this.classList.remove('active'); }); } .test { transition: all 0.3s ease-out; } .active { filter: blur(10px); transform: translateY(20px); }
Причина - ресурсоемкость размытия. Соответственно, на 100% решить проблему невозможно. Но, можно применить CSS-вуду некоторые оптимизации, которые помогут в большинстве случаев. upd.: После прочтения комментариев и проверки в Firefox (Win, Andr) и Opera (Win), делаю вывод что я ошибался относительно причин. Видимо, они все-таки в Chrome под винду и андроид.

Вариант решения:
for (let img of document.querySelectorAll('.test')) { img.addEventListener('mouseenter', function () { this.classList.add('active'); }); img.addEventListener('mouseleave', function () { this.classList.remove('active'); }); } .test { transition: filter 0.3s steps(18), transform 0.3s ease-out; backface-visibility: hidden !important; transform: translate3d(0, 0, 0) scale(1, 1); } .active { filter: blur(10px); transform: translate3d(0, 20px, 0) scale(1, 1); }
Данное решение включает в себя (в порядке значимости):
ограничение числа кадров перехода, steps(18) 60кадров/с (лимит браузера) * 0,3с = 18 Это также делает временную функцию перехода линейной, что сильно ускоряет подсчеты (но это не просто аналог linear, а лучше). отключение отрисовки оборотной стороны элемента через backface-visibility: hidden Смысл очевиден: флип не выполняется => нет смысла рендерить оборотку. исключение из пересчета transform трансформации по X и Z, а также масштабирования Плюс, translate3d создает новый слой при рендеринге элемента - что, в свою очередь, должно вынудить браузер задействовать GPU не только при размытии.

Запрос на SQL с динамически меняющимися условиями выборки

Есть запрос SQL. Параметры выборки будут всегда одинаковы, но условия выборки могут быть разными.
Требуется эти условия сохранять в БД и затем подставлять, по необходимости, в запрос. Как сделать это, допустим, через PHP я себе могу представить (просто выбираем из таблицы нужное условие и присоединяем к строчке запроса).
Можно ли это реализовать на SQL? Т.е. вернуть данные от стандартного запроса с присоединенными условиями, выбранными из таблицы БД?


Ответ

Да, можно.
Составить SQL запрос можно так же как и в PHP, надо выбрать из таблицы нужное условие и присоединить к строчке запроса. Любой SQL клиент в этом контексте мало чем отличается от PHP клиента, разве что синтаксисом конкантинации строчных значений.
В PL/SQL воспользуйтесь динамическим запросом:
declare sqlStmt varchar2 (32000); result <тип ресультата>; whereCond varchar2 (4000); begin sqlStmt := 'select ... from ... where '; execute immediate sqlStmt||whereCond into result; end;
Но всё вышеизложенное абсолютно не нужно для решения задачи как в вопросе. Надо просто составить только один SQL запрос учитывая условия ранее сохранённые в БД.

Релиз программы с сторонней библиотекой. C#

Подключил стороннюю библиотеку через NuGet(OxyPlot). Как выпустить релиз? Какие файлы нужны для работы программы на других ПК?


Ответ

Для работы на других ПК необходимо выполнить несколько условий:
Должен быть установлен .NET Framework, версии не ниже, чем целевая версия, указанная в проекте (см. свойства проекта). Файлы сторонних библиотек, должны находиться рядом с исполняемым файлом, или быть доступными для загрузки в память любым другим способом, например через GAC, как системные сборки, или более сложную структуру папок в проекте. Вовсе не обязательно все валить в одну папку, можно аккуратно разложить по вложенным, тут главное правильно линки прописать в проекте.
При штатной установке через NuGet, сторонняя библиотека линкуется в проект с параметром Copy local установленным в true. Этот параметр отвечает за необходимость копировать подключенную DLL в выходной каталог приложения. Так можно заставить копироваться и системные сборки, только в этом нет необходимости. Если сомневаетесь, что ваша подключенная DLL попадет в папку приложения, просто проверьте этот параметр в свойствах подключенной сборки.
В принципе для распространения вашего приложения, достаточно переключить конфигурацию проекта в Release и выполнить построение проекта, после чего просто копировать папку /bin/Release на целевую машину или запаковать папку в архив и выложить в сеть. Если нужен инсталятор, то можно воспользоваться технологией ClickOnce (ссылку на документацию привел @Bulson в комментарии под вопросом) или любым другим инсталятором, какой больше знаком или просто нравится.
В пользу ClickOnce, можно отнести встроенный механизм автоматического обновления при соответствующей настройке правил публикации. Однако если у вас большой проект, то не стоит использовать для публикации Visual Studio, т.к. ее встроенная публикация не позволяет использовать частичное обновление и клиентам придется качать все при каждом обновлении. Ручная публикация приложения ClickOnce возможна, но это уже за рамками данного вопроса.

Boxing при интерполяции строк в c#

Есть код 1
int i = 123; string s = $"{i}";
И есть код 2
int i = 123; string s = $"{i.ToString()}";
В первом варианте будет происходить боксинг или с интерполяцией не происходит такого и компилятор понимает что надо вызвать ToString?


Ответ

1)
string s = $"{i}";
превращается в string.format, который принимает object'ы, боксинг присутствует

2)
string s = $"{i.ToString()}";
передается строка, боксить нечего

Центрировать текст относительно ромба

Подскажите, как его отцентрировать, чтобы как на фото было?

.zaslugi_icons { width: 140px; float: left; padding-top: 48px; padding-left: 39px; padding-right: 18px; } .zaslugi_icons p { font-family: 'Open Sans', sans-serif; font-weight: 300; color: #000; } .zaslugi_icons span { display: block; }

Реализованных проектов

Положительных отзыва

Лет опыта



Ответ

Без псевдо элементов
* { margin: 0; padding: 0; } .unit { background: #fff; width: 150px; height: 150px; border: 1px solid red; position: relative; transform: rotate(45deg); overflow: hidden; margin: 0 40px; } .border { position: absolute; top: 15px; left: 15px; width: 120px; height: 120px; border: 1px solid blue; } .wrapper { display: flex; margin: 10px; } .over { width: 100px; height: 100px; transform: rotate(-45deg); position: absolute; top: 25px; left: 25px; text-align: center; line-height: 100px; border-radius: 50%; } .unites { height: 200px; padding: 30px; position: relative; } .unites .vois { color: red; position: absolute; bottom: 0; left: 0; width: 100%; text-align: center; font-size: 1.2em; }

75

Наши отзывы

115

Выполненые работы

180

Количество благодарных клентов

75

Наши отзывы

115

Выполненые работы

180

Количество благодарных клентов


SVG clipPath в Bootstrap

Хочу сделать из фотографии одной картины модульную картину из 5 частей с помощью clipPath Как бы получается, но в адаптивной верстке все едет: картинка адаптируется, части нет. Как зафиксировать картинку в каждой части при изменении размера окна?
https://jsfiddle.net/aq9Laaew/31565/
.modular{clip-path:url(#modular)} .modular{max-height: 80vh; max-width: 100%; display: block; margin: 15px auto;} Модульная картина


Ответ

Чтобы приложение было адаптивно и не разрушались пропорции между фрагментами изображения необходимо сделать следующее:
Изображение добавить внутрь svg с помощью команды и задать размеры его в процентах width="100%" height="100" Окна вырезать комбинированной маской. При присвоении одним частям маски fill="white" она будет прозрачна и в вырезанных окошках будут видны фрагменты изображения. Закраска fill="black" делает участок маски непрозрачным - это белые перемычки между окнами. Обернуть svg

в родительский контейнер. Изменяя проценты ширины и высоты контейнера можно регулировать начальные размеры блока.
.container { width:100%; height:100%; }

Приложение полностью адаптивно и работает во всех браузерах

Как написать текст символами в консоль Visual Studio?

Язык программирования с++. Нужно вставить надпись
cout << "███████████████████████████████████" << endl; cout << "█─███─█───█─███────█────█─███─█───█" << endl; cout << "█─███─█─███─███─██─█─██─█──█──█─███" << endl; cout << "█─█─█─█───█─███─████─██─█─█─█─█───█" << endl; cout << "█─────█─███─███─██─█─██─█─███─█─███" << endl; cout << "██─█─██───█───█────█────█─███─█───█" << endl; cout << "███████████████████████████████████" << endl; cout << "██████████" << endl; cout << "█───█────█" << endl; cout << "██─██─██─█" << endl; cout << "██─██─██─█" << endl; cout << "██─██─██─█" << endl; cout << "██─██────█" << endl; cout << "██████████" << endl; cout << "██████████████" << endl; cout << "█───█─██─█───█" << endl; cout << "██─██─██─█─███" << endl; cout << "██─██────█───█" << endl; cout << "██─██─██─█─███" << endl; cout << "██─██─██─█───█" << endl; cout << "██████████████" << endl; cout << "█████████████████████" << endl; cout << "█────█────█─███─█───█" << endl; cout << "█─████─██─█──█──█─███" << endl; cout << "█─█──█────█─█─█─█───█" << endl; cout << "█─██─█─██─█─███─█─███" << endl; cout << "█────█─██─█─███─█───█" << endl; cout << "█████████████████████" << endl;


Ответ

Можно отображать и в UTF-8 (cp65001), но c этой кодировкой обычно больше проблем. Проще выводить в UTF-16, в этом случае не придется дополнительно возится с кодировкой файлов и консоли, только поставить режим вывода стандартного потока:
#include #include #include #include
int main() { ::_setmode(::_fileno(stdout), _O_U16TEXT); auto const & sz_message { L"███████████████████████████████████" L"
" L"█─███─█───█─███────█────█─███─█───█" L"
" L"█─███─█─███─███─██─█─██─█──█──█─███" L"
" L"█─█─█─█───█─███─████─██─█─█─█─█───█" L"
" L"█─────█─███─███─██─█─██─█─███─█─███" L"
" L"██─█─██───█───█────█────█─███─█───█" L"
" L"███████████████████████████████████" L"
" }; ::std::wcout << sz_message << ::std::flush; ::_wsystem(L"pause"); return(0); }

С пиксельным шрифтом 8х12 (в этом случае еще не будет антиалиасинга и разрывов между строками):

Перегрузка операторов перечисляемого типа в Delphi

Можно ли перегрузить оператор для перечисляемого типа? т.е. имеем например:
Type TAngle = (a0, a90, a180, a270);
Var AngleA, AngleB, AngleC: TAngle;
AngleA := a90; AngleB := a180; AngleC := AngleA + AngleB; //a270 AngleC := a270 + AngleB; //a90 AngleC := AngleB + a180; //a0
По идее перегрузить бы оператор сложения, но это возможно только для записей, как я понимаю? Может можно запись через Implicit неявно приводить к этому перечисляемому типу? Но тогда это всё равно будет уже новый тип.
Вообще логика такая получается, пока сделал через функцию:
Result := TAngle((Ord(AngleA) + Ord(AngleB)) Mod 4)


Ответ

Как уже сказано в ответе @zed перегрузка доступна только для записей. Поэтому, если хочется, вы можете добавить соответствующую структуру, и работать с ней.
TAngleValue = (av0, av90, av180, av270);
TAngle = record FValue : TAngleValue;
function getAngle():integer; public class operator Add(a, b: TAngle ):TAngle; class operator Implicit(angle: TAngleValue):TAngle;
property Angle: integer read getAngle; property Value: TAngleValue read FValue; end;
перегрузив сложение и, для начала, неявное приведение
class operator TAngle.Add(a, b: TAngle): TAngle; begin result.FValue := TAngleValue( (byte(a.FValue) + byte(b.FValue)) mod 4); end;
class operator TAngle.Implicit(angle: TAngleValue): TAngle; begin result.FValue := angle; end;
function TAngle.getAngle(): integer; begin result := byte(FValue)*90; end;
в итоге само манипулироввание значениями получится таким, как вы хотели
var a, b, c : TAngle; begin a := av90; b := av180; c := a + b + av90;
writeln( a.Angle, ' ', b.Angle, ' ', c.Angle); readln; end.

Как с помощью регулярных выражений вытащить адрес сайта?

У меня есть список, в списке к примеру адреса по такому типу:
https://www.example.com/releases?release_type=stock_exchange_release https://www.example.org/our-services/services-near-me https://example.hu/en/ https://example.pitt.edu/en/ http://www.example.org.uk/index.php/blog?tid=Al
Как с помощью регулярных выражений вытащить из списка www.example.com www.example.org example.hu www.example.org.uk и т.п?


Ответ

Лучше воспользоваться специально предназначенным для этого инструментом
try: from urllib.parse import urlparse # Python 3.x except ImportError: from urlparse import urlparse # Python 2.x
urls = ['https://www.example.com/releases?release_type=stock_exchange_release' 'https://www.example.org/our-services/services-near-me', 'https://example.hu/en/', 'https://example.pitt.edu/en/', 'http://www.example.org.uk/index.php/blog?tid=Al']
res = [urlparse(u).netloc for u in urls] print(res)
результат:
['www.example.com', 'example.hu', 'example.pitt.edu', 'www.example.org.uk']

Помогите!!! Не выходит сделать кнопку со сложной анимацией!

Нужно сверстать такую кнопку
Вот ссылка на пример похожей кнопки и анимации ее границы https://rezart.agency/portfolio/artistream.ru/
Не выходит реализовать такую же анимацию, вот все что смог придумать .button { position: relative; display: block; background: none; border: none; border-top: 1px solid #CC1414; border-bottom: 1px solid #CC1414; padding: 11px 25px; color: #FFF; font-family: "CenturyGothic"; font-size: 14px; line-height: 16px; -webkit-transition: all .6s ease; transition: all .6s ease } .button:before { position: absolute; content: ""; display: block; height: 20px; width: 1px; background: #CC1414; left: 0; bottom: 0 } .button:after { position: absolute; content: ""; display: block; height: 20px; width: 1px; background: #CC1414; right: 0; top: 0 } .button:hover { cursor: pointer; text-decoration: none } .button:hover:before { bottom: 18px } .button:hover:after { top: 18px } Вернуться на гланую


Ответ

Кнопка в задаче выглядит несколько проще, чем в референсе, её можно в принципе и без svg сделать.
.button { position: relative; padding: 12px 36px; border-width: 1px 0; border-style: solid; border-color: #cc1414; background-color: transparent; margin: 0; outline: none; cursor: pointer; overflow: hidden; } .button::before, .button::after { content: ''; position: absolute; width: 1px; height: 150%; background: linear-gradient(-180deg, #cc1414 33.3%, rgba(0,0,0,0) 33.3%, rgba(0,0,0,0) 66.6%, #cc1414 66.6%); transition: transform .1s ease-out; } .button::before { left: 0; top: -50%; } .button::after { right: 0; top: 0; } .button:hover::before { transform: translateY(33.33%); } .button:hover::after { transform: translateY(-33.33%); }