Страницы

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

вторник, 23 октября 2018 г.

Переменные с _ в python

Смотрю примеры кода на различных сайтах и часто вижу переменные (или я не понимаю, что это) с вот таким символом "_". Например: _f или с двумя __. Гуглить не знаю по какому ключевому слову. Пример кода:
def run_once(f): """ >>> @run_once ... def foo(n): return n + 1
>>> foo(7) 8
>>> foo(0) 8 """ def _f(*args, **kwargs): if not hasattr(_f, "_retval"): _f._retval = f(*args, **kwargs) return _f._retval return _f
if __name__ == "__main__": import doctest doctest.testmod()


Ответ

Имя с одним подчёркиванием _name - по общему соглашению используется как аналог protected, защищённого имени в других языках. В других языках такое имя могут использовать только наследники класса. В питоне же это просто соглашение. Имя с двумя подчёркиваниями __name является аналогом private (в питоне псевдоприватное), имя только для внутреннего использования внутри модуля или класса. У таких имён есть специальная защита, и обратиться к нему снаружи можно только зная класс, в котором этот атрибут определен. Имена с двумя подчёркиваниями с двух сторон имени __name__ являются "магическими" методами, реализующими некоторую функциональность языка.

Что это за кнопка?

Подскажите, что это за кнопка? Как она называется? И как такую сделать?


Ответ

Это switch button
Пример реализации
По ссылке:
XML








Activity
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Switch switchButton, switchButton2; TextView textView, textView2; String switchOn = "Switch is ON"; String switchOff = "Switch is OFF";
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.switch_button_example);
// For first switch button switchButton = (Switch) findViewById(R.id.switchButton); textView = (TextView) findViewById(R.id.textView);
switchButton.setChecked(true); switchButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean bChecked) { if (bChecked) { textView.setText(switchOn); } else { textView.setText(switchOff); } } });
if (switchButton.isChecked()) { textView.setText(switchOn); } else { textView.setText(switchOff); }
// for second switch button switchButton2 = (Switch) findViewById(R.id.switchButton2); textView2 = (TextView) findViewById(R.id.textView2);
switchButton2.setChecked(false); switchButton2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean bChecked) { if (bChecked) { textView2.setText(switchOn); } else { textView2.setText(switchOff); } } });
if (switchButton2.isChecked()) { textView2.setText(switchOn); } else { textView2.setText(switchOff); } } }
Как будет выглядеть:

Как экранировать {} при использовании интерполяции?

Допустим, в некотором выражении я использую интерполяцию.
Если я хочу {} интерпритировать как часть строки, то что мне делать?
Я пробовал слешами экранировать, но не помогло...


Ответ

MSDN
Чтобы включить в интерполированную строку фигурные скобки («{» или «}»), используйте две фигурные скобки — «{{» или «}}». Дополнительные сведения см в разделе «Неявные преобразования».

Если поле PRIMARY KEY, то NOT NULL не нужен?

Есть поле, являющееся первичным ключом. Это поле не должно содержать «нулевых» значений.
Есть ли необходимость в NOT NULL, или достаточно только PRIMARY KEY?


Ответ

У уникальных полей есть одна забавная особенность. Уникальность определяется равенством. Но NULL не равен NULL! Поэтому значения NULL можно добавлять в столбец с проверкой на уникальность в любом количестве строк!
А первичный ключ должен уникально идентифицировать каждую строку по равенству значения этого ключа. Потому значение NULL для первичного ключа не имеет смысла. При сравнении равенством он просто никогда не совпадёт ни с какой строкой.
Это распространяется на все SQL-совместимые базы данных. Но процитирую определение первичного ключа с dev.mysql.com
A set of columns—and by implication, the index based on this set of columns—that can uniquely identify every row in a table. As such, it must be a unique index that does not contain any NULL values.

Набор столбцов и индекс по этому набору столбцов, способный однозначно идентифицироать каждую строку в таблице. Это уникальный индекс, не содержащий значений NULL
Так что да, PRIMARY KEY требует, чтобы его столбцы были NOT NULL
И в зависимости от того, каким синтаксисом определяется первичный ключ, указание NOT NULL может быть обязательным или необязательным. В MySQL (по всей видимости) обязательно всегда.
Синтаксис определения первичного ключа я встречал трёх видов:
Прямо при определении типа колонки, добавив PRIMARY KEY к её типу:
CREATE TABLE things ( id integer PRIMARY KEY )
Указание NOT NULL может быть необязательным. Но в MySQL, судя по примерам (документация не особо помогла), обязательно. В PostgreSQL же нет: там считается, что PRIMARY KEY в типе столбца включает в себя NOT NULL При определении первичного ключа в составе определения таблицы (но не её :столбцов)
CREATE TABLE things ( id integer NOT NULL, PRIMARY KEY(id) )
NOT NULL обязательно, иначе упоминание колонки в PRIMARY KEY будет конфликтовать с уже объявленным. При определении первичного ключа на уже созданной таблице отдельно.
NOT NULL обязательно, т. к. таблица уже определена.

Возможно ли убрать кнопку “Закрыть” в консольном приложении?

Можно ли как-нибудь убрать крестик(кнопку) закрытия в консольном приложении C#? Или даже отменить закрытие программы при нажатии на эту кнопку?


Ответ

Решение этой же проблемы с EN stackoverflow
Правда оно не "убирает", а делает неактивной.
using System; using System.Runtime.InteropServices;
namespace Test { class Program { private const int MF_BYCOMMAND = 0x00000000; public const int SC_CLOSE = 0xF060;
[DllImport("user32.dll")] public static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags);
[DllImport("user32.dll")] private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("kernel32.dll", ExactSpelling = true)] private static extern IntPtr GetConsoleWindow();
static void Main(string[] args) { DeleteMenu(GetSystemMenu(GetConsoleWindow(), false), SC_CLOSE, MF_BYCOMMAND); Console.Read(); } } }

Какая разница между конфигурационными файлами my.ini и my.cnf?

Какая разница между конфигурационными файлами my.ini и my.cnf?


Ответ

в актуальных версиях mysql, как видно из документации, в разных операционных системах дело обстоит немного по-разному.
в ms/windows:
сервер просматривает несколько каталогов (%PROGRAMDATA%\MySQL\MySQL Server 5.7\ (для версии 5.7), %WINDIR%\, C:\, BASEDIR\) в поисках как my.ini, так и my.cnf клиент просматривает дополнительно файл %APPDATA%\MySQL\.mylogin.cnf в unix-подобных:
сервер просматривает несколько каталогов (/etc/, /etc/mysql/, SYSCONFDIR/, $MYSQL_HOME/) в поисках только my.cnf клиент просматривает дополнительно файлы ~/.my.cnf и ~/.mylogin.cnf (каталог $MYSQL_HOME/, как написано в документации, клиент игнорирует)

inline термин в контексте C# / JIT компилятора

Добрый день. Столкнулся с таким вопросом,а именно хочу четко понять определение термина,такого как inline метод, соответственно в контексте C#(чтобы вопросы такого рода как "заинлайнить метод" отпали).
И вторая часть вопроса,почему JIT компилятору предпочтительнее inline методы?


Ответ

В контексте C#, насколько я понимаю, inline-подстановка означает оптимизацию при компиляции, при которой тело вызываемого метода встраивается в вызывающую функцию вместо вызова. На текущий момент такими оптимизациями занимается только JIT-компилятор.
В C# вы не можете заставить компилятор заинлайнить функцию, но вы можете попросить его об этом, используя атрибут [MethodImpl(MethodImplOptions.AggressiveInlining)]. Также вы можете попросить компилятор не встраивать функцию, указав атрибут [MethodImpl(MethodImplOptions.NoInlining)]

В отличие от этого в C++ ключевое слово inline означает, что сборщик должен игнорировать факт множественного определения функции в различных модулях компиляции (ослабляя тем самым ODR).

По поводу второй части вопроса: инлайнингом в C# занимается JIT-компилятор потому, что он знает точно целевую платформу. Точные критерии решения JIT-компилятора насчёт того, инлайнить ли данную функцию, меняются от версии к версии.
Согласно этому сообщению, инлайнингу не подвержены методы, которые:
Маркированы атрибутом MethodImplOptions.NoInlining Размер IL-кода которых больше 32 байт (при отсутствии атрибута MethodImplOptions.AggressiveInlining) Виртуальные методы Метод, принимающие тип-значение большого размера как параметр Методы в классах, производных от MarshalByRefObject Методы со сложным потоком управления
например, рекурсивные методы и методы с обработкой исключений Методы с экзотическими инструкциями, проверками безопасности и т. п.
Вот такой «список предпочтений» JIT-компилятора насчёт инлайн-методов.
Этот список, разумеется, не финальный, и будет пересматриваться (в сторону ослабления) в последующих версиях.

Генерация случайного пути

Подскажите функцию для генерации случайной плавной кривой (например, как на картинке). Либо алгоритм построения такой функции F(t), где t - динамический параметр


Ответ

Бросьте несколько равноудалённых случайных точек на плоскость. Координата x у которых будет постоянно возрастать на шаг h, а высота будет случайным числом. Сами решите каким именно. После этого аппроксимируйте это множество точек с помощью кубических сплайнов например.

Как в IDEA вернуть закрытую вкладку с логами

Запускаю проект, во вкладке RUN вижу вкладки для console и log. Случайно закрываю log и не понимаю как её вернуть без перезапуска проекта.
Есть ли какие-то хоткеи для этого?
Скрин с табом, который нужно вернуть после закрытия оного:

Немного подробностей:
Это Java, Servlet. Использую Gradle, команду appStartWar, в её конфиге, во вкладке Logs указал путь к файлу куда log4j2 пишет логи. Именно они во вкладке log выводятся и которую мне хочется иметь возможность открывать после закрытия.
UPD
Завёл багу на сайте производителя IDE: https://youtrack.jetbrains.com/issue/IDEA-170540


Ответ

Детально как дойти к нужному:

Если все настроено правильно то вы сможете видеть все логи в виде вкладок, примерно вот так:
[!] Важно: если вы закрыли вкладку лога и в опциях напротив этого лога установлена галочка то для его повторного отображения в виде вкладки необходим перезапуск вашего приложения (можно закрыть все вкладки логов которые у меня на скрине и они повторно будут отображены ТОЛЬКО после перезапуска как было отвечено выше и никак иначе), галочки после закрытия вкладки не снимаются сами по себе.
-- ок, если ни 1 из вариантов не подходит то: 1) вы можете добавить сам лог файл прямо в Editor и просматривать его содержимое там - перетащите файл прямо на панель Editor'a (проверьте кодировку - если что-то не так то Идея сама предложит возможные кодировки) 2) Для Editor в Keymap есть возможность переоткрывать закрытые вкладки на случай если вы ее закрыли, для консольных вкладок такого компонента в моей версии Идеи нет (2016.5.2 - в младших тоже не встречал) - нужно только назначить комбинацию тут: "File - Settings - Keymap" - найти "Editor Tabs" - "Reopen Closed Tabs".

Чем является каретка для JavaScript?

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

Обновление (перенесено из комментария)
Информация из всех образовавшихся в комментариях обсуждений, безусловно, пригодится, но я вернусь к основной теме. Спрошу так: вот есть курсор внутри поля ввода и есть JavaScript. Какова причина, по которой в нативном JavaScript отсутствует средства для работы с кареткой типа getCaretPosition(), moveCaretToPosition(), getTextAfterCaret() и т. д.? Наверняка это не лень разработчиков, а какие-то трудности взаимодействия JavaScript с браузером.


Ответ

Объект Selection представляет диапазон текста выделенный пользователем или текущую позицию курсора (каретки).
Этот объект не является частью JavaScript, он реализуется браузером.
Для управления курсором в TextArea есть следующие поля:
selectionStart Возвращает/задаёт индекс начала выделенного текста. Если нет выделенного текста, возвращает индекс символа следующего за курсором. selectionEnd Возвращает/задаёт индекс окончания выделенного текста. Если нет выделенного текста, возвращает индекс символа следующего за курсором.

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

#include
template std::ostream & fun(const T * dd) { return std::cout << *dd << " T*" << '
'; }
template std::ostream & fun(const T & dd) { return std::cout << dd << " T&" <<'
'; }
int main() { int a = 5; int * b = new int(7); fun(a); fun(b); fun(const_cast(b));//в этом случае вызывается нужная функция return 0; }


Ответ

Потому что для вызова функции с параметром-указателем компилятору надо выполнить квалификационное преобразование int * -> const int *
А для вызова функции с параметром-ссылкой компилятору надо выполнить привязку ссылки int *const & к указателю типа int *. Обратите внимание, что, в отличие от предыдущего варианта, в данном случае квалификатор const относится к указателю int * (!), а не к указуемому типу int
Оба варианта имеют статус exact match ("полное совпадение"), но в первом случае требуется навешивание дополнительного const на тип указуемого объекта, а во втором случае тип указуемого объекта совпадает точно. Поэтому вариант со ссылкой и выбирается в процессе overload resolution.
Можно убрать из рассмотрения шаблонность (она здесь только лишний туман создает) и сократить пример до такого
void foo(const int *p) { std::cout << " T*" << '
'; }
void foo(int *const &p) { std::cout << " T&" <<'
'; }
int main() { int *b = 0; foo(b); }
Здесь тоже будет вызваться ссылочная версия по тем же самым причинам.
Более того, и ссылочность тут тоже существенной роли не играет и ситуация в моем примере может быть сведена к выбору между
void foo(const int *p); void foo(int *p);
В ситуации, когда можно вызвать функции с разными степенями cv-квалификации параметров, overload resolution выбирает наименее cv-квалифицированный вариант.

Наследование внутренних классов в java

Объясните кто может, как происходит наследование вложенных non-static классов. На примере следующего кода:
public class Auto { public class Door { private double height;
public Door(double height) { this.height = height; } } }
public class LadaDoor extends Auto.Door { public LadaDoor(Auto auto) { auto.super(0); } }
Почему конструктор выглядит именно так. Почему вызов super() на объекте внешнего класса вызывает конструктор внутреннего??


Ответ

Экземпляр нестатического внутреннего класса всегда связан с экземпляром внешнего. В вашем случе Door не может существовать без какого-то конкретного экземпляра Auto
Поэтому при создании экземпляра класса дочернего по-отношению к внутреннему необходимо связать его с объектом, который будет им владеть.
Выражение auto.super(0) обозначает вызов конструктора родительского класса (Auto.Door) в контексте экземпляра auto
В терминологии языка Java это называется Qualified Superclass Constructor Invocation (конкретизированный вызов родительского класса).
Qualified superclass constructor invocations begin with a Primary expression or an ExpressionName. They allow a subclass constructor to explicitly specify the newly created object's immediately enclosing instance with respect to the direct superclass (§8.1.3). This may be necessary when the superclass is an inner class.
Адаптированный перевод:
Конкретизированный вызов конструктора родительского класса начинается с выражения. Оно позволяет конструктору дочернего класса явно указать экземпляр, который будет содержать в себе создаваемый объект. Это может быть необходимо, когда родительский класс является внутренним.

Перечеркнутый текст по диагонали

Пробую трансформацией, но transform-origin приходится по пикселям подгонять, а если будет строка длиннее или короче, то все опять съезжает (должно быть по серединке).
Вопрос: Какие есть оптимальные варианты для верстки перечеркнутого текста по диагонали для строки разной длины?
.str { position: relative; display: inline-block; } .str:after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; width: 100%; height: 1px; background: red; transform: rotate(-10deg); }

Lorem ipsum.


Ответ

Самый просто способ , работает со любой разумной длиной
p{ white-space:pre; position:relative; display:inline-block; font-size:20px; } p:after{ content:""; display:block; position:absolute; left:0;top:50%; color:red; width:100%; height:0; border-bottom:2px solid red; transform:rotate(-1deg); }

Praesent sapien massa, convallis a pellentesque nec, egestas non nisi.

Praesent sapien massa,Praesent sapien massa, convallis a pellentesque nec, egestas non nisi.

Praesent sapien massa, convallis


C#. Thread.CurrentThread.IsBackground

Вопрос, наверняка, окажется глупым и не носящем практической ценности, но тем не менее. Сейчас вплотную разбираюсь с многопоточностью и параллельным программированием. На всех ресурсах пишут приблизительно следующее. "Приложение запускается всегда в приоритетном потоке...." и "При завершении всех приоритетных потоков, все фоновые также завершаются, даже, если не выполнили свои задачи". Отсюда сабж, почему приложение не завершается, когда явно указывается
Thread.CurrentThread.IsBackground = true;
?
Просьба помочь разобраться. И прицепом еще один. В чем практическое отличие
Task task = new Task(MyTask);
от
Thread tr = new Thread(new ThreadStart(MyTask));
?
я так понял, Задачи в целом эффективнее распределяются за счет планировщика задач


Ответ

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

По поводу второй части вопроса:
Thread — это физический (кроме очень крайних частных случаев) поток выполнения, имеющий прямое соответствие с потоками операционной системы. Task — абстракция задания, которое будет когда-либо выполнено, и соответствующий заданию код может бежать в одном или нескольких, иногда даже в нулевом количестве потоков.
Для случая использования, который вы привели, разница в эффекте незначительна: Task в том виде, в котором он вызывается в вашем с коде из вопроса, выполняется на потоке из пула потоков, а Thread создаётся вне пула. Но есть разница в использовании
Для Thread'а вы можете лишь вызвать Join, и синхронно дождаться его завершения.
Для Task вы можете, кроме того, установить продолжение посредством ContinueWith, которое будет выполнено в будущем, по завершению этого Task'а. Кроме того, вы можете дождаться о окончания Task'а асинхронно, используя await. Вы можете снаружи поймать и обработать исключение, произошедшее при выполнении Task'а. Всё это с Thread'ом недоступно.

Как сделать свечение вокруг SVG иконки?


Как создать свечение вокруг иконки SVG? Иконка SVG будет являться ссылкой, то есть hover работает только в рамках этой иконки. Форма иконки сложная (не квадрат или груг). Иконка то же должна менять цвет при наведении.


Ответ

Если цвет подсветки должен зависить от цвета картинки, то можно дважды положить эту картинку (одну поверх другой) и нижнюю заблюрить:
svg { height: 8em; } div { position: relative; display: inline-block; margin: 1em; } div > svg:first-child { filter: blur(16px); overflow: visible; position: absolute; z-index: -1; }


Отправка HTML кода из Textarea

Итак. Есть некий скрипт, часть из которого приведена ниже, который отправляет HTML код из поля