Страницы

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

среда, 17 апреля 2019 г.

Почему возвращается объект?

Помогите пожалуйста понять что детально происходит при таком вызове:
String.prototype.camelCase=function(){ return [typeof this, this]; } console.log("camel case word".camelCase());
Непонятно в первую очередь почему возвращается тип объект, а не строка.
Я понимаю, что вызов camelCase() происходит в контексте "camel case word". То есть this будет указывать на эту строку. НО именно на строку, а возвращается почему-то, объект.


Ответ

Так как данная функция не в strict моде, this внутри нее является объектом класса String, а не литералом строки. Поэтому тип соответствующий.
Если добавить директиву "use strict", то будет ожидаемый тобой результат
String.prototype.strictCamelCase = function() { "use strict"; return [typeof this, this]; } console.log("camel case word".strictCamelCase());

Проверка целой строки с помощью регулярного выражения

var re = /((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)/; var str4 = "1300.6.7.8"; console.log(re.test(str4));
почему тест выдаёт тру, объясните пожалуйста. цель - проверяю IP v.4 address


Ответ

Нужно добавить ^ (начало строки) в начало и $ (конец строки) в конец шаблона для проверки на начало и конец строки. Без ^ и $ находится подстрока.
var re = /((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)/; var str4 = "1300.6.7.8"; console.log(str4.match(re)); var re2 = /^(((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d))$/; console.log(str4.match(re2)); console.log(re2.test(str4));

Обёртка для примитива Boolean как объект

Возможно ли заставить обёртку для примитива Boolean вести себя как объект?
Например, следующий код:
public static void testBoolean(int a, Boolean isLeft) throws Exception { if (a > 3) { isLeft = Boolean.TRUE; } else { isLeft = Boolean.FALSE; } }
public static void main(String[] args) { Boolean isLeft = Boolean.TRUE; testBoolean(5, isLeft); System.out.println(isLeft); testBoolean(1, isLeft); System.out.println(isLeft); }
выводит:
true true
Есть ли какой-либо способ заставить изменяться isLeft в методе testBoolean как объект (чтобы второй раз выводилось false)?


Ответ

Нет, такого способа нету. Объекты ведут себя именно так. Вы спутали со случаем изменения ссылки на объект со случаем изменения (мутации) самого объекта.
В метод testBoolean передаётся ссылка на объект типа Boolean по значению
Внутри метода меняется не сам объект, а лишь ссылка isLeft на него! Поскольку в функцию передаётся лишь копия ссылки (в этом смысл передачи по значению), изменения её снаружи не видны. Вот если бы вы как-то меняли сам объект, то тогда да, его изменения были бы видны снаружи.

Java не поддерживает передачу ссылок по ссылке, но можно сделать грубый хак, и передать вместо ссылки одноэлементный массив:
public static void testBoolean(int a, Boolean[] isLeft) throws Exception { if (a > 3) { isLeft[0] = Boolean.TRUE; } else { isLeft[0] = Boolean.FALSE; } }
https://ideone.com/wa0prq
При этом передаётся копия ссылки на массив, в котором доступен «оригинал» ссылки на Boolean
Точно так же в качестве «контейнера» оригинала ссылки можно использовать AtomicBoolean (но он при этом производит ненужную синхронизацию), ну или самостоятельно написать универсальный контейнер:
class UniversalContainer { T value; public UniversalContainer() {} public UniversalContainer(T initial) { value = initial; } public T get() { return value; } public void set(T value) { this.value = value; } }

public static void testBoolean(int a, UniversalContainer isLeft) { if (a > 3) { isLeft.set(Boolean.TRUE); } else { isLeft.set(Boolean.FALSE); } }
public static void main(String[] args) { UniversalContainer isLeft = new UniversalContainer(Boolean.TRUE); testBoolean(5, isLeft); System.out.println(isLeft.get()); testBoolean(1, isLeft); System.out.println(isLeft.get()); }
https://ideone.com/VwSM19

Нужно сделать обводку при наведении

Есть у меня вот такая реализация, где при наведении плавно появляется нижний бордер, а теперь нужно в таком стиле сделать весь прямоугольник
Код, это все что слева
.order-row { display: flex; width: 50%; height: 84vh; margin-top: 1vh; background: url(../img/14days.jpg) no-repeat; background-size: cover; } .link { display: flex; margin: auto; } .link h2 { display: block; margin: auto; text-align: center; font-size: 30px; font-weight: 400; } .link-order { width: 435px; height: 130px; background: rgba(255, 255, 255, 0.7); } .link-order h2::after { display: block; content: ''; border-bottom: 1px solid #2d2d2d; transform: scaleX(0); transform-origin: 100% 50%; transition: transform 450ms ease-in-out; } .link-order h2:hover::after { transform: scaleX(1); transform-origin: 0% 50%; }



Ответ

Лучший вариант такой анимации без использования SVG будет выглядеть так:
* { -webkit-box-sizing: border-box; box-sizing: border-box; } body { margin: 0; padding: 0; height: 100vh; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; text-transform: uppercase; } a { position: relative; color: #333; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; display: block; text-decoration: none; background: none; border: 0; -webkit-box-shadow: inset 0 0 0 2px transparent; box-shadow: inset 0 0 0 2px transparent; padding: 20px 40px; } a:after, a:before { content: ''; display: block; position: absolute; -webkit-box-sizing: border-box; box-sizing: border-box; border: 1px solid transparent; width: 0; height: 0; } a:after { top: 0; left: 0; -webkit-transition: border-color 0s ease-in 0.8s, width 0.2s ease-in 0.6s, height 0.2s ease-in 0.4s; -o-transition: border-color 0s ease-in 0.8s, width 0.2s ease-in 0.6s, height 0.2s ease-in 0.4s; transition: border-color 0s ease-in 0.8s, width 0.2s ease-in 0.6s, height 0.2s ease-in 0.4s; } a:before { bottom: 0; right: 0; -webkit-transition: border-color 0s ease-in 0.4s, width 0.2s ease-in 0.2s, height 0.2s ease-in; -o-transition: border-color 0s ease-in 0.4s, width 0.2s ease-in 0.2s, height 0.2s ease-in; transition: border-color 0s ease-in 0.4s, width 0.2s ease-in 0.2s, height 0.2s ease-in; } a:hover:after, a:hover:before { width: 100%; height: 100%; } a:hover:after { border-top-color: rgba(0, 0, 0, .3); border-right-color: rgba(0, 0, 0, .3); -webkit-transition: width 0.2s ease-out, height 0.2s ease-out 0.2s; -o-transition: width 0.2s ease-out, height 0.2s ease-out 0.2s; transition: width 0.2s ease-out, height 0.2s ease-out 0.2s; } a:hover:before { border-bottom-color: rgba(0, 0, 0, .3); border-left-color: rgba(0, 0, 0, .3); -webkit-transition: border-color 0s ease-out 0.4s, width 0.2s ease-out 0.4s, height 0.2s ease-out 0.6s; -o-transition: border-color 0s ease-out 0.4s, width 0.2s ease-out 0.4s, height 0.2s ease-out 0.6s; transition: border-color 0s ease-out 0.4s, width 0.2s ease-out 0.4s, height 0.2s ease-out 0.6s; } Сделать заказ

Как передать строку в запрос к БД

Имеется функция:
def data_selection(): c.execute("SELECT * FROM TEST WHERE num = 5")
Я хочу сделать так, чтобы пользователь сам ввёл num = 5 с клавиатуры и передать эту строку в запрос.
Подскажите пожалуйста, как можно провернуть что - то подобное?


Ответ

inp = input() z = 'SELECT * FROM TEST WHERE num = ' + str(inp) c.execute(z)

Каков синтаксис описаний (synopsis) команд?

Например SYNOPSIS команды apt
apt [-h] [-o=config_string] [-c=config_file] [ -t=target_release] [ - a=architecture] {list | search | show | update | install pkg [{=pkg_version_number | /target_release}]... | remove pkg... | upgrade | full-upgrade | edit-sources | {-v | --version} | {-h | --help}}
https://manpages.debian.org/stretch/apt/apt.8.en.html
Что означают все эти скобки, палки и многоточия или курсив? Есть мнение что синтаксис вообще не документирован и написан чисто от балды.


Ответ

Интересный вопрос. Что-то я ранее не задумывался, т.к. такое описание встречается повсеместно в документации как разных утилит, так и в документации к языкам программирования.
Оказывается, этот синтаксис не только документирован, но и является частью POSIX стандарта, описанного в части Utility Argument Syntax
Кратко по основным моментам:
utility_name [-a] [-b] [-c option_argument] [-d|-e] [-f[option_argument]] [operand...]
сначала пишется название утилиты, за ней параметры и аргументы в квадратных скобках указываются необязательные опции и аргументы аргументы упомянутые в одной группе через разделитель | означают, что эти аргументы взаимно-исключающие и не могут использоваться совместно троеточие означает, что допустимо несколько этот параметр несколько раз упоминаний {} в стандарте не вижу, очевидно это сделано для облегчения чтения и записи описания утилиты с множеством взаимоисключающих параметров. По стандарту синопсис должен был быть записан как-то так:
apt [-h] [-o=config_string] [-c=config_file] [-t=target_release] [-a=architecture] list apt [-h] [-o=config_string] [-c=config_file] [-t=target_release] [-a=architecture] search apt [-h] [-o=config_string] [-c=config_file] [-t=target_release] [-a=architecture] show apt [-h] [-o=config_string] [-c=config_file] [-t=target_release] [-a=architecture] update # и так далее на каждое действие

Защита от SQL инъекций в jdbc java

Часто вижу утверждения, что надо использовать PreparedStatement вместо обычного Statement, чтобы защититься от sql инъекций. Как он защищает?


Ответ

Коротко, для нетерпеливых:
При использовании Statement строки запроса и значений складываются.
При использовании PreparedStatement имеется шаблон запроса и данные в него вставляются, с отражением кавычек.
Ниже подробнее с примерами.

Вступление.
Имеем такую простую таблицу с данными.
+-----------+----+--------+ | userName | id | pass | +-----------+----+--------+ | admin | 1 | admin | | user | 2 | pass | | chuchelo | 3 | elli | +-----------+----+--------+
Модель User, будет содержать имя и пароль, а так же метод логин, который спросит данные с консоли.
class UserLogin { String name; String pass;
public UserLogin() { }
public void login() { BufferedReader reader = null; try{ reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("user name: "); name = reader.readLine();
System.out.println("pass: "); pass = reader.readLine(); } catch (IOException e) { e.printStackTrace(); }finally { if (reader != null) try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } }

Метод, который будет работать с обычным Statement
UserLogin user = new UserLogin(); user.login(); try (Connection connect = MyConnection.getConnection()){ Statement statement = connect.createStatement(); String query = "SELECT userName, id, pass FROM users WHERE userName='" + user.name + "' AND pass = '" + user.pass + "'"; System.out.println(query); ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()){ System.out.printf("User: id=%d name=%s pass=%s
", resultSet.getInt("id"), resultSet.getString("userName"), resultSet.getString("pass")); } MyConnection.closeConnect(); } catch (SQLException e) { e.printStackTrace(); }
Теперь если мы запустим этот метод и введем в консоль данные без инъекции:
user name: admin pass: admin
User: id=1 name=admin pass=admin
При этом сам запрос выглядит так:
SELECT userName, id, pass FROM users WHERE userName='admin' AND pass = 'admin'
Если допустить ошибку в имени или пароле, то данные выведены не будет.
Теперь попробуем использовать инъекцию(' or'1'='1), т.е. введем такие данные:
user name: admin' or'1'='1 pass: blabla
То мы все равно получаем результат, несмотря на то, что пароль неверный:
User: id=1 name=admin pass=admin
При этом сам запрос теперь выглядит так:
SELECT userName, id, pass FROM users WHERE userName='admin' or'1'='1' AND pass = 'blabla'
т.к. выражение or'1'='1' всегда равно true, то даже без указания пароля мы получим все данные.

Как от этого защитит PreparedStatement?
Метод который будет получать данные из базы с помощью PreparedStatement
UserLogin user = new UserLogin(); user.login(); try (Connection connect = MyConnection.getConnection()){ String query = "SELECT userName, id, pass FROM users WHERE userName=? AND pass=?"; PreparedStatement statement = connect.prepareStatement(query); statement.setString(1, user.name); statement.setString(2, user.pass); System.out.println(statement); ResultSet resultSet = statement.executeQuery();
while (resultSet.next()){ System.out.printf("User: id=%d name=%s pass=%s
", resultSet.getInt("id"), resultSet.getString("userName"), resultSet.getString("pass")); } MyConnection.closeConnect(); } catch (SQLException e) { e.printStackTrace(); }
Все тоже самое, только заменили обычный Statement на PreparedStatement. Надеюсь вы на слово поверите, что при правильных данных мы получим верный результат, если нет то вот лог в консоли:
user name: user pass: pass User: id=2 name=user pass=pass Запрос: SELECT userName, id, pass FROM users WHERE userName='user' AND pass='pass'
А теперь попробуем использовать инъекцию:
user name: user' or'1'='1 pass: inject
И ответа не получаем, потому что запрос выглядит так:
SELECT userName, id, pass FROM users WHERE userName='user\' or\'1\'=\'1' AND pass='inject'
Т.е. все кавычки были отражены слешем, инъекция не удалась.

Отличие Statement от PreparedStatement
Statement - вы должны заботиться о кавычках в запросе и ставить их там где они нужны.
PreparedStatement - вставляет значения в запрос и за счет методов setString setInt и прочих. Он сам понимает где нужны кавычки, а где нет. Соответственно все входные данных оборачивает ими.

Для чего нужен reserve() в C++?

Не могу понять, в чем смысл функции reserve(). Она выделяет память, но не создает элементов, увеличивает емкость, но не размер. Для чего она нужна если все можно сделать с помощью resize()?


Ответ

Для оптимизации. resize требует инициализации всех элементов, и делает размер контейнера строго заказанным. Он становится заполненным чем-то - что вам может быть не нужно в данный момент. При этом вам придется отслеживать отдельно реальную заполненность вашего вектора, т.к. size() будет, по сути, врать - говоря, сколько всего элементов в векторе, а не элементов, нужных вам. Если же вы хотите добавлять с помощью resize() равно столько элементов, сколько вам в данный момент нужно - то это просто бестолку потраченное время на инициализацию и не более того... потому что каждый вызов будет вызывать перераспределение памяти и копирование.
reserve подготавливает место для последующего заполнения, так что какой-нибудь push_back будет гарантированно (а не амортизированно) выполняться за O(1) - без каких-либо перераспределений памяти, съедающих массу времени... При этом size() будет давать точное количество элементов, итератор end() показывать куда надо...
Примерно так. Если не убедил - могу еще немного поубеждать :)

Проблема с обновлениями Windows 7

Начиная с некоторого момента в пределах месяца (точнее сказать не могу) перестала работать служба обновления. Любые попытки ее запуска, поиска обновлений наталкиваются на
Центр обновлений Windows в настоящее время не может выполнить поиск обновлений, поскольку эта служба не запущена. Возможно, потребуется перезагрузить компьютер.
Понятно, что перегрузка ничего не дает. Службы "Центр обновления Windows" и "Фоновая интеллектуальная служба передачи" работают. Перезапускал вручную - не помогает.
Ничего нового вроде бы не ставил, настройки не менял.
Windows 7 64-разрядная.
Та же ерунда на еще двух машинах дома - только и того, что там Windows 7 32-разрядная.
Грешил на какое-то обновление - попробовал снести последние обновления Windows - тоже не помогло. Обновления Office или Visual Studio не сносил.
Windows Update Troubleshooter скачивал, запускал. Копался, сказал, что все исправлено - но ничего не изменилось.


Ответ

Вероятно, нарушились индексы в папке %systemroot%\SoftwareDistribution. Удалять ее пока не нужно, лучше переименовать. Подробный инструктаж, как это сделать. Если список вновь обнаруженных обновлений будет велик, не рекомендую устанавливать все скопом, - могут возникнуть противоречия, лучше устанавливать по нескольку за раз.

ASP.NET Core. Защита jwt токенов

Я использую в своем проекте jwt токены. Код для создания ClaimsIdentity
public async Task GetClaimsIdentityAsync(User user) { var roles = await _roleService.GetUserRolesAsync(user);
var claims = new List { new Claim(ClaimsIdentity.DefaultNameClaimType, user.Username), }; foreach (var role in roles) { claims.Add(new Claim(ClaimsIdentity.DefaultRoleClaimType, role.Name)); } ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, "Token", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType); return claimsIdentity; }
Код для создания токена:
public async Task GetJwtToken(User user) { var identity = await _sinInService.GetClaimsIdentityAsync(user);
var now = DateTime.UtcNow;
var jwt = new JwtSecurityToken( issuer: AuthOptions.ISSUER, audience: AuthOptions.AUDIENCE, notBefore: now, claims: identity.Claims, expires: now.Add(TimeSpan.FromMinutes(AuthOptions.LIFETIME)), signingCredentials: new SigningCredentials(AuthOptions.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256)); return new JwtSecurityTokenHandler().WriteToken(jwt); }
Код в классе Startup
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.RequireHttpsMetadata = false; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = AuthOptions.ISSUER,
ValidateAudience = true, ValidAudience = AuthOptions.AUDIENCE, ValidateLifetime = true,
IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(), ValidateIssuerSigningKey = true, }; });
Код был взят из этой статьи: https://metanit.com/sharp/aspnet5/23.7.php
Получив строку токена можно авторизоваться с любого браузера или устройства.
Необходимо сделать так, чтобы токеном мог воспользоваться только тот, кому он был предназначен. Думаю сделать это таким образом: на серверной стороне генерируется уникальный ключ. Этот ключ потом отправляется вместе с jwt токеном в каждом запросе, что позволяет определить какое устройство получает доступ. Но этот ключ тоже могут украсть, как и сам токен :(
Также необходимо сделать так, чтобы если параметры пользователя изменились, ранее выданные токены стали невалидными. Ничего лучше, чем черный список токенов в бд я для этого не придумал. Должны же быть какие-то стандартные методы для сброса токенов.


Ответ

Получив строку токена, можно авторизоваться с любого браузера или устройства.
Да, эта проблема, которую токены аутентификации не решают. Поэтому важно реализовать следующие возможности:
Использовать HTTPS вместо HTTP, это защитит от перехвата токенов. При сохранении токенов, использовать средства ОС, которые прячут их от других программ/пользователей. Например, в Андроид-приложениях задействуйте Internal Storage с флагом MODE_PRIVATE Делайте время жизни токена небольшим, например, 20 или 30 минут. Плюсом токена, относительно логина и пароля является время жизни: даже если его удалось перехватить, обычно это случается слишком поздно.
Ничего лучше, чем черный список токенов в бд я для этого не придумал. Должны же быть какие-то стандартные методы для сброса токенов.
Для того, чтобы токены можно было отключать, например, реализовывать логаут, их действительно придётся хранить. Мы для этого используем не БД, а кэш Redis, где указываем время хранения. И работает быстрее, и старые записи чистить не надо.
Порядок действий:
При создании токена генерируете уникальный идентификатор токена "jti" (JWT ID). Создаёте токен доступа (access token). В Redis (ну или в БД) заносите access_token с ключом, основанном на "jti", указав время жизни токена доступа (30 минут). При аутентификации проверяете подпись JWT и время жизни, хранящееся в самом JWT. Если всё нормально, извлекаете значение "jti" и проверяете, есть ли такой ключ в Redis. Если есть, всё нормально, если нет, значит, был логаут, или пользователя выкинул администратор. В любом случае считаем, что пользователь аутентификацию не прошёл.
Такое решение позволяет реализовать логаут и бан и является достаточно безопасным.
Из-за короткого времени жизни токена доступа, необходимо реализовать перелогин через токен обновления. Этот токен тоже нужно хранить в Redis, только время жизни задавать больше (вполне нормальным считается даже месяц, но вы смотрите, что подходит к вашей предметной области).
При логауте/бане токен обновления также нужно удалять, как и токен доступа.
Дальше идут детали, которые вам придётся учитывать. Если нужен бан, значит, администратору каким-то образом нужно уметь узнавать "jti" по идентификатору пользователя. Можно например "jti" делать равным "sub" (то есть идентификатору пользователя). В этом случае пользователь не сможет одновременно работать с разных устройств, потому что у него может быть только один токен доступа. Если нужно, чтобы мог работать, можно например "jti" формировать в виде $"{sub}:{random}". Тут возможны разные решения в зависимости от предметной области, но в целом ничего сложного нет.

Выравнивания блока по центру другого блока bootstrap

Displaying the Result

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo.


Есть такая разметка HTML:
#promo-block{ height:300px; position: relative; z-index: 1; text-align: center; background: url(img/1920x1080/02.jpg) no-repeat; background-size: cover; background-position: center center; background-attachment: fixed; min-height:100%; }
Вот такой CSS:
Как я могу выровнять текст по центру родителя? Выровнять его по горизонтали не составило труда, но по вертикали никак не получается.


Ответ

#promo-block { height: 300px; display: flex; flex-wrap: wrap; background: url(img/1920x1080/02.jpg) no-repeat; background-size: cover; background-position: center center; background-attachment: fixed; } #promo-block .container{ align-self: center; display:flex; flex-wrap: wrap; } .col-sm-6 { display: flex; flex-wrap: wrap; justify-content: center; }

Displaying the Result

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo.


Можно вот-так на флексах.

Открыть magnific popup галлерею в новом окне

Есть код:
$('.modal-gallery-link').magnificPopup({ removalDelay: 500, //delay removal by X to allow out-animation callbacks: { beforeOpen: function() { this.st.mainClass = this.st.el.attr('data-effect'); }, open: function () { }, }, midClick: true // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source. }); $(".gallery").magnificPopup({ delegate: '.gallery-link', type: 'image', callbacks: { beforeOpen: function () { }, buildControls: function () { this.contentContainer.append(this.arrowLeft.add(this.arrowRight)); } }, gallery: { tCounter: '%curr% / %total%', enabled: true } }); .modal-gallery-link { color: #000; display: block; } .modal-inner { display: flex; } .modal-inner a { display: block; margin: 1rem; } img { max-width: 100%; } Open Gallery


После клика на ссылку открывается галлерея, по клику на превью изображения галлереии окно должно закрываться и открываться окно с этой картинкой, но не так, не с open, afterOpen второе окно не срабатывает.
Вопрос: как реализовать открытие превьюшек magnific popup, если ссылки находятся в уже открытом popup?


Ответ

Решила эту задачу так (может быть кому-то пригодится тоже):
var imgs = $('.gallery-link img'); imgs.each(function(){ var item = $(this).closest('.gallery-link'); item.css({ 'background-image': 'url(' + $(this).attr('src') + ')', 'background-position': 'top center', '-webkit-background-size': 'cover', 'background-size': 'cover', }); $(this).addClass('hide'); }); $('.modal-gallery-link').magnificPopup({ removalDelay: 500, callbacks: { beforeOpen: function() { this.st.mainClass = this.st.el.attr('data-effect'); }, open: function () { $('.gallery-link').on('click', function(e){ e.preventDefault(); console.log(items); $.magnificPopup.close(); setTimeout(function(){ $.magnificPopup.open({ items: items, type: 'image', gallery: { enabled: true } }); }, 500); }); }, afterClose: function () { }, }, midClick: true }); var items = []; $(".gallery .gallery-link").each(function() { items.push( { src: $(this).attr("href"), } ); }); .modal-gallery-link { color: #000; display: block; } .modal-inner { display: flex; } .modal-inner a { display: block; margin: 1rem; } .gallery-link { display: block; width: 300px; height: 300px; } img { max-width: 100%; } img.hide { width: 0; height: 0; display: block; position: 0; margin: 0; visibility: hidden; opacity: 0; } .modal { background: #fff; max-width: 1131px; width: 100%; margin: auto; } .mfp-close-btn-in .mfp-close { color: #fff; } Open Gallery


Как определить, является ли заданная строка десятичным представлением натурального числа от 1 до 2^64-1 включительно?

Еще условие: строка не должна начинаться с "0".
Например:
"0" – нет "1" – да "07" – нет "18446744073709551615" (264 − 1) – да "18446744073709551616" (264) – нет


Ответ

Как вариант
package main
import ( "fmt" "strconv" "strings" )
func checkStr(str string) bool {
if strings.TrimPrefix(str, "0") != str { fmt.Println("Начинается с 0") return false } if _, err := strconv.ParseUint(str, 10, 64); err != nil { fmt.Println(err) return false } return true }
func main() { fmt.Println(checkStr("18446744073709551615")) fmt.Println(checkStr("18446744073709551616")) fmt.Println(checkStr("1b")) fmt.Println(checkStr("-1234567")) fmt.Println(checkStr("07")) }

Отображение содержимого input.value в режиме реального времени в .innerHTML

При вводе данных в input они должны сразу же отображаться в .innerHTML. Как это сделать?
var one = document.getElementById('one'); var here = document.getElementById('here'); var par = document.createElement('p'); par.innerHTML = parseInt(one.value); here.appendChild(par); #here { border: 1px solid #000; width: 150px; margin: 10px; line-height: 50px; text-align: center; }



Ответ

С помощью обработчика события input
document.getElementById('one').addEventListener('input', function() { document.getElementById('here').innerText = this.value; });


Как создать вёрстку для Wordpress?

Хочу научится делать сайты на WordPress со своей вёрсткой (делать свои шаблоны). В интернете много информации о том, как натягивать вёрстку на WordPress, но меня интересует какие требования есть для вёрстки которую я собираюсь интегрировать туда? Можно делать любую вёрстку или нужно делать специально так, чтобы её можно поставить на WordPress? То есть соответствующие меню, сайдбары и т.п?


Ответ

Хочу научится делать сайты на WordPress со своей вёрсткой
Для этого нужно выбрать в оф.каталоге тему, подходящую по структуре/макету и, создав к ней дочернюю, уже в дочке "верстать" то, что понадобится. И ни в коем случае не нужно пытаться сделать "свою тему" пока не будет достаточно опыта в работе с ВП.
Необходимый минимум: https://codex.wordpress.org/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BC
http://codex.wordpress.org/%D0%98%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2
https://codex.wordpress.org/%D0%A2%D0%B5%D0%B3%D0%B8_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2
В интернете много информации о том как натягивать вёрстку на wordpress,
Не нужно читать и смотреть этот интернет-хлам.
меня интересует какие требования есть для вёрстки которую я собираюсь интегрировать туда?
https://codex.wordpress.org/%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0#.D0.A0.D0.B0.D0.B7.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D0.BA.D0.B0_.D1.82.D0.B5.D0.BC
https://codex.wordpress.org/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%9D%D0%A2%D0%9CL
https://codex.wordpress.org/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_CSS
https://codex.wordpress.org/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_Javascript

Передача ссылки на Activity в AsyncTask, почему плохо и как можно было иначе

Всё что внизу описано, это то как я использовал интерфейс для получения результата из AsynckTack в главный поток, используя CallBack. Почему мне сказали, что плохо , что я передал ссылку на активити в AsyncTask? И как лучше надо было это исполнить?
Вот в классе MainActivity вызываю такой метод и как видите передаю ссылку на активити в AsyncTack
private void UploadData() { String url = "https://qwerty.ru" ; AsyncUploadingData asyncUploadingData = new AsyncUploadingData(this); asyncUploadingData.execute(url); } }
В AsyncTack вложен интерфейс
interface AsyncResult { void getResult(String answer); }
Объявлен private AsyncResult mCallback;
И в конструкторе принимаю ссылку на активити. И неявно привожу к интерфейсу(правильно так выразиться?)
AsyncUploadingData(AsyncResult mCallback) { this.mCallback = mCallback; }
И в опеределенный момент вызываю метод интерфейса, а интерфейс подключен в MainActivity
mCallback.getResult(answer);


Ответ

Почему мне сказали, что плохо , что я передал ссылку на активити в AsyncTask?
Хранение ссылки на активити в AsyncTask чревато тем, что в случае уничтожения переданной активити в момент работы асинстаска:
а) Произойдет утечка памяти, так как GC не сможет убрать из памяти активити, так как на нее будет хранится ссылка (в случае с strong reference);
б) Вызов методов активити, в лучшем случае, ни к чему не приведет, а в худшем – будут возникать ошибки.
Первая проблема решается хранением активити в виде weak reference, однако вторая проблема остается.
И как лучше надо было это исполнить?
Существует большое количество способов решения данной проблемы.
Например, можно воспользоваться лоадерами или retain-фрагментами (лоадеры сохраняют состояние как раз с помощью retain-фрагментов).
Можно использовать различные библиотеки, например Chronos
Если используете MVP, то можно воспользоваться библиотекой Moxy, которая, в частности, решает возникшую у Вас проблему.

Как получить размерность int в байтах ? Без использования sizeof

Это каким-то образом связано с переполнением?


Ответ

Для беззнаковых сработает такой вариант
unsigned int a = (unsigned int)-1; unsigned int bits = 1; while (a >>= 1) bits++; unsigned int bytes = bits / 8;
Впрочем, количество бит в байте не оговорено стандартом.

RecursionError: maximum recursion depth exceeded - как преодолеть?

Есть задача в вопросе; есть ее решение, где по изяществу Python "победил" C#, но вот у же на х=512 вылетает RecursionError: что посоветуете, отцы? Как преодолеть, если хочется посчитать для х=1024 скажем?
import functools from math import sqrt
@functools.lru_cache() def f(x): if x <=1: return 0 return 1 + min([ f(m + x // m - 2) for m in range(1,int(sqrt(x))+1) if x%m ==0])
добавлю после первого ответа:
Кто предложит как изменить алгоритм?
Кстати. Добавил количество рекурсии до 5000. Получается странная фигня. для 1024 считает, делая 3600 итераций, а для 2048 - "выбивает" интерпретатор на 1000+ рекурсии. Вообще не пойму - в чем проблема....


Ответ

Я python не знаю... Но на С++ решение этой задачи - вот в этом ответе: https://ru.stackoverflow.com/a/770528/195342
Как видите, на ideone решило миллиард за 0.04с без особого напряжения по стеку.
Ключевые моменты:
Перебор с отсечением
Мы сразу отсекаем особо длинные рекурсии, которые, очевидно, не приведут к оптимальному решению.
Начинаем со значений, близких к корню
Такая вот эвристика - там цепочки самые короткие, и мы сразу найдем решение, которое позволит отсечь большое количество заведомо плохих решений и не лезть глубоко в рекурсии.
Мемоизация
Позволит не считать повторно то, что уже посчитано. Кстати, подозреваю, что она не сильно и нужна, но сохранилась с предыдущих попыток решить задачу. Возможно, имеет смысл заменить массив, все-таки с немалым размером, на map (словарь). Это уже надо проверять и экспериментировать, но увы, сегодня на это уже нет времени.
Да, это не так красиво выглядит... Но зато решает с очень малой глубиной рекурсии и очень быстро.
Еще раз извиняюсь за незнание python... Вроде у малого в школе на следующий год обещают его преподавать - ну, вот тогда придется изучить и исправиться :)
Update
Использовал вместо массива на миллиард байт просто map. На моей машине миллиард вместо 77ms стал считаться 104ms, но зато при этом потребовалось только 44675 элементов в map. Экономию памяти оцените сами :)
При полном отказе от мемоизации не получается восстановить решение, но сама величина - 8 - для миллиарда находится за примерно 580ms.

Разница между singleton в Java и в Spring

Наткнулась на такие строки про область видимости Singleton в Spring:
Note that there is a subtle difference between the instance obtained using the Java Singleton pattern and Spring Singleton. Spring Singleton is a singleton per context or container, whereas the Java Singleton is per process and per class loader.
Мой перевод:
Обратите внимание, что существует тонкая разница между экземпляром, полученным с использованием шаблона Java Singleton и Spring Singleton. Spring Singleton уникален в рамках контекста или контейнера, тогда как Java Singleton - в рамках процесса или загрузчика классов.
И, во-первых, хотелось бы удостовериться, что мой перевод правильный. А во-вторых, хотелось бы глубже понять разницу между singleton в Java и в Spring...


Ответ

Перевод верный.
Spring Singleton уникален в рамках контекста или контейнера
Это значит, что каждый раз, запрашивая singleton-бин из одного и того же контекста, вы будете получать один и тот же объект:
ApplicationContext ctx = new ClassPathXmlApplicationContext("/application-context.xml"); MySingleton s1 = ctx.getBean("mySingleton", MySingleton.class); MySingleton s2 = ctx.getBean("mySingleton", MySingleton.class); // s1 == s2
Но если синглтон будет получен из другого контекста или будет создан НЕ Spring'ом (через new или какой-нибудь другой контейнер), вы получите другой объект.
ApplicationContext ctx1 = new ClassPathXmlApplicationContext("/application-context.xml"); ApplicationContext ctx2 = new ClassPathXmlApplicationContext("/application-context.xml"); MySingleton s1 = ctx1.getBean("mySingleton", MySingleton.class); MySingleton s2 = ctx2.getBean("mySingleton", MySingleton.class); MySingleton s3 = new MySingleton(); // s1 != s2 // s2 != s3 // s1 != s3
Java Singleton уникален в рамках процесса или загрузчика классов
Это значит, что в рамках одного процесса JVM вы не сможете создать два разных экземпляра класса синглтона*. В этом случае сам класс-синглтон должен конроллировать процесс создания собственных экземпляров (в отличие от предыдущего случая, где этот процесс контроллируется контейнером Spring'а). Обычно этого добиваются, делая конструктор private и разрешая получать экземпляры класса только через статический метод этого класса, который всегда отдаёт один и тот же объект.
* Это можно попытаться обойти при помощи Reflections API, загрузки одного и того же класса несколькими classloader'ами (отсюда оговорка "в рамках загрузчика классов") или другими грязными хаками.

jquery: не работает выбор элемента по классу и атрибуту одновременно

Пытаюсь выбрать все элементы, у которых есть класс choosen и атрибут repeattype. По отдельности работает, а оба условия сразу - нет:
// все элементы с классом "choosen" var allChoosen = $('.choosen'); console.log(allChoosen.length); // 1 элемент, как и ожидается // все элементы с атрибутом "repeattype" var allRepeattype = $('[repeattype]'); console.log(allRepeattype.length); // 2 элемента, как и ожидается // одновременно не получается: var choosenAndRepeat = $('.choosen [repeattype]'); console.log(choosenAndRepeat.length); // 0 элементов почему-то // пробовал поиск в выбранных (choosen) // для наглядности сам элемент: console.log(allChoosen[0]); // значение атрибута достать можно: console.log(allChoosen[0].getAttribute('repeattype')); // но поиск в choosen по имени атрибута не работает: console.log(allChoosen.find('[repeattype]').length); // 0

1
2


Ответ

У вас неправильно составлен селектор. .choosen [repeattype] означает элементы с атрибутом repeattype, являющиеся потомками элементов с классом choosen
Аналогично работает allChoosen.find('[repeattype]')
Если необходимо находить элементы с классом choosen и атрибутом repeattype необходимо указывать их в селекторе без пробела .choosen[repeattype]. Если необходимо находить элементы с классом choosen или элементы атрибутом repeattype, то необходимо ставить запятую .choosen, [repeattype]
См. также:
Знаете ли вы селекторы? Multiple Class / ID and Class Selectors (на английском)

Почему input.value не меняется второй раз

Делаю свой input, ввожу в него данные и он сразу их заменяет на "11.11", так у меня и должно быть. Но если после этой замены я продолжаю вводить данные, он перестаёт их заменять, этого я не понимаю.
У меня стоит v-bind:value="val" и по идее если я перезаписываю this.val он должен это отображать в инпуте. Сам val меняется, я его выводу, но не в инпуте.
Vue.component('currency-input', { template: ` val: {{val}} `, data: function() { return { val: "" }; }, methods: { updateValue: function(value) { this.val = "11.11"; } } }); // создание корневого экземпляра var app = new Vue({ el: '#app', template: `

`, })


Ответ

Проблема в том, что vue при привязке данных использует отслеживание зависимостей и меняет только то, что изменилось.
Когда вы одному и тому же свойству val раз за разом присваиваете одно и то же значение - оно не меняется, а потому не вызывает обновления биндингов.
Привязку данных следует применять только в тех случаях когда есть лишь один источник изменений в один момент времени, а не когда два источника данных (вы и пользователь) "дерутся" за одно и то же свойство.
v-model же работает потому что в свойство val записываются сначала данные от пользователя, потом ваши. Но это не решение: использовав v-model вы больше не сможете гарантировать что в свойстве val находится именно то что вам нужно.
Правильно в таком случае работать с элементом напрямую.

PS если вы пытаетесь таким хитрым образом сделать фильтрацию вводимых символов - лучше блокируйте нежелательные символы через preventDefault() а не через присвоение value. Присвоение value сбрасывает текущее положение текстового курсора.

Grid-разметка в IE11

Здравствуйте, подскажите, как мне изменить стили grid-разметки под IE11, во всех браузерах, кроме этого отображается корректно. Даже gulp-autoprefixer не спасает (не знаю в чем причина), в общем сам пример:
.first-row { display: grid; grid-gap: 16px; margin: 16px 0; grid-template-columns: 1fr 1fr 1fr; background-color: #fff; color: #444; } .first-row .box { background-color: #444; color: #fff; border-radius: 5px; display: flex; justify-content: center; align-items: center; position: relative; overflow: hidden; } .col0 { grid-column: 1; grid-row: 1 / 3; height: 50px; } .col1 { grid-column: 2; grid-row: 1 / 2; height: 17px; } .col2 { grid-column: 2; grid-row: 2; height: 17px; } .col3 { grid-column: 3; grid-row: 1 / 3; height: 50px; } .second-row { display: grid; grid-gap: 16px; margin: 16px 0; grid-template-columns: 1fr 1fr 1fr 1fr; background-color: #fff; color: #444; } .box { background-color: #444; color: #fff; border-radius: 5px; display: flex; justify-content: center; align-items: center; position: relative; overflow: hidden; } .col4 { grid-column: auto; grid-row: 1; height: 17px; } .col5 { grid-column: auto; grid-row: 1; height: 17px; } .col6 { grid-column: auto; grid-row: 1; height: 17px; } .col7 { grid-column: auto; grid-row: 1; height: 17px; }

Каталог товаров

1

2

3

4

5

6

7

8


Интересует вопрос по префиксам, как правильно под IE11 записать, например, grid-row: 1 / 3 или grid-gap: 16px, в документации не очевидно...


Ответ

Не добавляйте фиксированную высоту для самих клеток грида. Добавляйте высоту их детям. К сожалению, автопрефиксов для гридов в IE будет недостаточно. И вообще, автопрефиксы бывают разные с разной степенью качества и направленности, универсальных нет. Но выход есть, и это миксины. А если понимать особенности гридов в IE, то можно и вручную:
/** * Eric Meyer's Reset CSS v2.0 (https://meyerweb.com/ eric/tools/css/reset/) * http://cssreset.com */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } /* HTML5 display-role reset for older browsers */ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } table { border-collapse: collapse; border-spacing: 0; } .first-row { display: -ms-grid; display: grid; grid-gap: 16px; margin: 16px 0; -ms-grid-columns: 1fr 16px 1fr 16px 1fr; -ms-grid-rows: 1fr 16px 1fr; grid-column-gap: 16px; grid-row-gap: 16px; grid-template-columns: 1fr 1fr 1fr; background-color: #fff; color: #444; } .first-row .box { background-color: #444; color: #fff; border-radius: 5px; display: flex; justify-content: center; align-items: center; position: relative; overflow: hidden; } .col0 { -ms-grid-column: 1; -ms-grid-column-span: 1; grid-column: 1; -ms-grid-row: 1; -ms-grid-row-span: 3; grid-row: 1 / 3; } .col0 h2{ height: 50px;} .col1 { -ms-grid-column: 3; -ms-grid-column-span: 1; grid-column: 2; -ms-grid-row: 1; -ms-grid-row-span: 1; grid-row: 1 / 2; } .col1 h2{ height: 17px;} .col2 { -ms-grid-column: 3; -ms-grid-column-span: 1; grid-column: 2; -ms-grid-row: 3; -ms-grid-row-span: 1; grid-row: 2; } .col2 h2{ height: 17px;} .col3 { -ms-grid-column: 5; -ms-grid-column-span: 1; grid-column: 3; -ms-grid-row: 1; -ms-grid-row-span:3; grid-row: 1 / 3; } .col3 h2{ height: 50px;} .second-row { display: -ms-grid; display: grid; grid-gap: 16px; margin: 16px 0; -ms-grid-columns: 1fr 16px 1fr 16px 1fr 16px 1fr; grid-template-columns: 1fr 1fr 1fr 1fr; background-color: #fff; color: #444; } .box { background-color: #444; color: #fff; border-radius: 5px; display: flex; justify-content: center; align-items: center; position: relative; overflow: hidden; } .col4 { -ms-grid-column: 1; -ms-grid-column-span: 1; grid-column: auto; -ms-grid-row: 1; -ms-grid-row-span: 1; grid-row: 1; } .col4 h2{ height: 17px;} .col5 { -ms-grid-column: 3; -ms-grid-column-span: 1; grid-column: auto; -ms-grid-row: 1; -ms-grid-row-span: 1; grid-row: 1; } .col5 h2{ height: 17px;} .col6 { -ms-grid-column: 5; -ms-grid-column-span: 1; grid-column: auto; -ms-grid-row: 1; -ms-grid-row-span: 1; grid-row: 1; } .col6 h2{ height: 17px;} .col7 { -ms-grid-column: 7; -ms-grid-column-span: 1; grid-column: auto; -ms-grid-row: 1; -ms-grid-row-span: 1; } .col7 h2{ height: 17px;} a{color:#fff}

Каталог товаров

1

2

3

4

5

6

7

8


Особенность состоит в основном в том, что в ие нужно прописывать весть список колонок вместе с отступами - gap для ие не существует. То есть, если у вас ряд 1fr 1fr с гапом в 16px, то в ие это будет ряд 1fr 16px 1fr. Соответственно место у второй колонки будет не второе, а третье. А ширину колонки(ряда) с ее местом тоже нужно писать в разных свойствах -ms-grid-column-span - ширина, -ms-grid-column - место колонки.

Генерирование версии программы

Можно ли сделать так, что бы в Caption формы при каждой компиляции программы выполнялся автоматический инкремент версии?


Ответ

Атрибут [assembly: AssemblyVersion(...)] может использоваться для автоматической нумерации, если вы укажете его в формате
[assembly: AssemblyVersion("1.0.*")]
или
[assembly: AssemblyVersion("1.0.0.*")]
При этом обозначенные звёздочками части версии будут подсчитаны автоматически. Например, третья часть версии (build) будет подсчитана как количество полных дней с 1.1.2000, то есть, по формуле
(DateTime.Now - new DateTime(2000, 1, 1)).Days
Это даст увеличение build number каждый день.
Четвёртая часть (revision) будет подсчитана как половина количества секунд от начала текущих суток, не беря в расчёт летнее время. Это даст увеличение номера revision каждые две секунды.
Документация: AssemblyVersionAttribute @ docs.microsoft.com

Для того, чтобы получить номер версии, можно использовать
Assembly.GetExecutingAssembly().GetName().Version
(ну и ToString(), если нужно для вывода).

Компоненты Windows, судя по всему, используют похожую схему версионирования, но немного другую. Например, мой экземпляр cmd.exe имеет версию 10.0.16299.15. [Это отдалённо похоже на отсчёт с Unix epoch, но интернет не подтверждает это.]

Ещё по теме: Передавать в программу время компиляции

Js, запятая вместо точки запятой

Почему такое выражение не выдаёт ошибку:
i=5,console.log(i)
а такое выражение выдаёт ошибку ?
var i=5,console.log(i)
такой синтаксис кода обычно в jquery-плагинах. Как правильно составлять такие выражения через запятую? к примеру чтобы можно ещё было добавить к вышеприведённому выражению функцию-обработчик
i=5, console.log(i),function test(){var test='test';alert(test);}; test();
это выражение выдаёт ошибку


Ответ

В вашем примере есть два разных выражения, это оператор var и оператор (запятая). Поэтому рассматривать их надо отдельно друг от друга.
Оператор var позволяет определять переменные, при этом синтаксис позволяет определить сразу несколько, перечислив их через запятую. При этом значение может быть вычислено из сложных выражений.
var имя1 = значение1, имя2 = значение2, имя3, имя4, имя5 = значение5 ...
К примеру:
var a = 10, b = 20, c = a + b, d = function test() { return c; }, e = d() * d()
Поэтому если сначала встретили слово var, то дальше запятая имеет отношение именно к нему.
И есть отдельно оператор (запятая). Оператор "запятая" вычисляет оба операнда и возвращает значение второго, как правило он используется, когда хочется включить несколько выражений в то место, где должно быть одно (чаще всего объявление в цикле for).
1, 2 //-> 2 1, 2, 10 + 30 //-> 40 1, function test(){ console.log("test"); } //-> ƒ test(){ console.log("test"); }
Учитывая специфику его работы, то он не привяжет функцию к общему контексту и она не будет доступна по имени test(). Видимо она привязывается к внутреннему контексту выполнения. Но вы можете ее вернуть и использовать.
var test = (1, function test(){ console.log("test"); }); test();

Сохранение и воспроизведение mp3-файла, полученного по HTTP

Необходимо синтезировать русскую речь на Python 3.6. Решил воспользоваться Yandex SpeechKit. В документации сказано, что в качестве ответа сервер возвращает звуковой файл в заданном в запросе формате (в моем случае mp3). Как дальше можно сохранить или воспроизвести этот файл?


Ответ

Для того, чтобы воспроизвести аудио, нужно его сначала сохранить. Это делается очень просто с помощью библиотеки requests и pyglet
import requests import pyglet # ... Ваш код text_to_speech = '' # текст, который будет воспроизведён request = requests.get('https://tts.voicetech.yandex.net/tts', params={'text': text_to_speech}) with open('foo.mp3', 'wb') as file: file.write(request.content) song = pyglet.media.load('foo.mp3') song.play() pyglet.app.run()
Без сохранения в файл, к сожалению, сделать немногим сложнее, в pyglet я такой "фичи" не нашёл. Может потому что плохо искал, не знаю Но для таких целей мне подошёл GStreamer. Правда с установкой придётся немного повозиться, т.к. на данный момент очень мало актуальных инструкций в интернете.

Стили как у button

Здравствуйте! Ситуация следующая:
Есть div. Нужно, чтоб он вёл себя с контентом внутри как кнопка. То есть, чтоб текст и блоки внутри выравнивались по центру (по вертикали и горизонтали) и чтоб при изменении размеров border не менялись внутренние и внешние размеры блока.
Вопрос может и глупый, но я в css ещё относительно новичёк, так что прошу вашей помощи.


Ответ

.div_btn{ width:150px; height:40px; background: tomato; display:flex; align-items:center; justify-content:center; } .div_btn a{ text-transform:uppercase; font-size:14px; color:#fff; font-weight:900; font-family:sans-serif; text-decoration:none; }


Привязка к статическому идексатору

У меня возникла проблема с привязкой статического свойства в XAML. Руководствовался данным ответом. В классе у меня определена статическая переменная:
class Worker { public static ObservableCollection CountInDirections { get; set; } static Worker() { CountInDirections = new ObservableCollection { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; } }
Но в XAML коде появляется следующая ошибка:
Член "CountInDirections[6]" не распознан или недоступен.
Вот что в XAML:


Ответ

Попробуйте так:
{Binding Path=(local:Worker.CountInDirections)[6]}

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

Как математически грамотно (желательно на Java) одним условием проверить, принадлежит ли натуральное число b отрезку [a, c], где a и c так же натуральные числа? Условие должно выполниться, например, при таких значениях a, b, и c соответственно: (1, 2, 3), (5, 7, 10), (17, 25, 25), но не должно выполниться, например, при таких значениях a, b, и c соответственно: (2, 1, 3), (17, 25, 24). Условие должно быть одно, использовать логические операторы (такие как &&, ||, и т.п.) нельзя.


Ответ

Если точка лежит внутри отрезка, то сумма расстояний от этой точки до крайних точек отрезка всегда равна расстоянию между крайними точками. Если точка лежит вне отрезка, тогда сумма расстояний всегда будет больше. Иллюстрация:
Как известно, расстояние между двумя точками на отрезке – это модуль разности координат этих точек.
Отсюда получаем условие:
Math.abs(b - a) + Math.abs(b - c) == c - a // с учётом, что всегда c >= a, иначе Math.abs(c - a)

Как реализовать непрерывную интерграцию в Android?

Добрый день окутываюсь миром ci нашел много тутториалов но вот для Android все тихо.Как работать с Cİ в андроиде ?какие технологии есть для этого ?где можно посмотреть ?прошу любую информацию


Ответ

Я делал так:
Берём VPS любого хостера. Нужен довольно мощный комп. У меня - 4Гб операты, 6ГГц проц и SSD Ставим туда Java, Git, Gradle, Tomcat Выбираем систему для CI. Я выбрал Jenkinks, но есть другие, например, TeamCity Прописываем CI из какого репозитория checkout делать. Прописываем ему собрать проект gradlew assembleRelease Заливаем в маркет плагином к Jenkins

объект Bundle равен null в onCreate()

Я сохраняю состояние активити в onSaveInstanceState()
Если открыть список недавних приложений и закрыть моё, а потом запустить, в onCreate() передается null; а если не закрывать, а просто открыть другое приложение, а потом вернуться, onCreate() не вызовется. onRestoreInstanceState() не вызывается никогда.
UPD Как сохранить данные при закрытии приложения, чтобы когда пользователь откроет его потом, он увидел старое состояние активити?


Ответ

Должно быть вы новичок в Android, но все мы с чего-то начинаем. Вам не хватает знаний о жизненном цикле активности. Подробнее можете прочитать здесь: http://developer.alexanderklimov.ru/android/theory/lifecycle.php
Касательно ваших вопросов:
метод protected void onCreate(Bundle savedInstanceState) вызывается при создании активности. Активность создается когда мы впервые её открываем или же когда меняем ориентацию с вертикальной на горизонтальную и наоборот. В первом случае savedInstance = null, потому что в нём нет информации и появиться неоткуда. Второй вариант интереснее. При повороте устройства старая активность уничтожается, но перед своим исчезновением успевает вызвать protected void onSaveInstanceState(Bundle outState). Значение outState передается в качестве аргумента в новую активность в метод onCreate(Bundle savedInstanceState). Если вы явно не укажете какие параметры нужно передать в новую активность, то Bundle savedInstanceState будет равен null.
Разберём настоящее приложение. Для этого нам поможет инструмент LogCat. В методах onCreate, onSavedInstance, и onDestroy выведем в LogCat информацию, что именно этот метод был вызван. Пр-р:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("myTag", "call onCreate()"); if (savedInstanceState == null){ Log.i("myTag", "saveInstanceState == null"); } else { Log.i("myTag", "saveInstanceState != null"); } }
@Override protected void onDestroy() { Log.i("myTag", "call onDestroy"); super.onDestroy(); }
@Override protected void onSaveInstanceState(Bundle outState) { Log.i("myTag", "call onSaveInstanceState"); outState.putString("i", "j"); super.onSaveInstanceState(outState); }

Пояснения к картинке
Строка 1. Мы заходим в приложение и тем самым запускаем главную активность. В этот момент запускается метод onCreate(Bundle savedInstanceState).
Строка 2. В методе onCreate(Bundle savedInstanceState) мы сравниваем Bundle savedInstanceState с null. Соответствующую запись выводим в LogCat.
Строка 3. Мы меняем ориентацию экрана устройства. (переворачиваем из вертикального положения в горизонтальное или наоборот). Вызывается метод onSaveInstanceState(Bundle outState). Для того, чтобы Bundle outState не был пустым я предварительно в методе onSaveInstanceState(Bundle outState) добавил строку outState.putString("keyForString", "The string I want to save.");
Строка 4. Активность уничтожается, вызывая метод onDestroy();
Строка 5. Создается новая активность, вызывается метод onCreate(Bundle savedInstanceState).
Строка 6. В методе onCreate(Bundle savedInstanceState) мы сравниваем Bundle savedInstanceState с null. Но в методе onSaveInstanceState(Bundle outState) мы добавили свою строку, которая находится в объекте Bundle savedInstanceState. Поэтому мы видим что savedInstanceState != null
Строка 7. Я удовлетворился результатом и нажал кнопку назад. Т.о. мы закрыли текущую активность и видим, что вызвался метод onDestroy()
Идём дальше
а если не закрывать, а просто открыть другое приложение, а потом вернуться, onCreate() не вызовется.
Верно, метод onCreateне вызовется, вместо него вызовется метод onStart. По ранее указанной ссылке вы наглядно увидите, что после того как вы скрыли приложение вызовется метод onStop, а при возвращении вызовется onStart

Пример из документации:
https://developer.android.com/training/basics/activity-lifecycle/recreating.html?hl=ru#SaveState
Сохранение состояния операции
Когда начинается остановка операции, система вызывает метод onSaveInstanceState(), чтобы операция могла сохранить информацию о состоянии с помощью набора пар "ключ-значение". По умолчанию при реализации этого метода сохраняется информация о состоянии иерархии представления операции, например текст в виджете EditText или положение экрана для ListView. Для сохранения дополнительной информации о состоянии операции необходимо реализовать onSaveInstanceState() и добавить к объекту Bundle пары "ключ-значение". Например:
static final String STATE_SCORE = "playerScore"; static final String STATE_LEVEL = "playerLevel";
...
@Override public void onSaveInstanceState(Bundle savedInstanceState) { // Save the user's current game state savedInstanceState.putInt(STATE_SCORE, mCurrentScore); savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); }
Внимание! Реализацию суперкласса onSaveInstanceState() следует вызывать во всех случаях, чтобы реализация по умолчанию могла сохранить состояние новой иерархии.

Восстановление состояния операции
В случае воссоздания операции после предыдущего уничтожения сохраненное состояние можно восстановить из Bundle, куда система передает данные операции. Методы обратного вызова onCreate() и onRestoreInstanceState() получают один и тот же Bundle, содержащий информацию о состоянии экземпляра. Поскольку метод onCreate() вызывается, если система создает новый экземпляр операции или восстанавливает предыдущий экземпляр, перед попыткой чтения необходимо убедиться, что Bundle имеет состояние null. В этом случае система создает новый экземпляр операции вместо восстановления ранее уничтоженного экземпляра. Приведем пример восстановления некоторых данных о состоянии в onCreate():
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance if (savedInstanceState != null) { // Restore value of members from saved state mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); } else { // Probably initialize members with default values for a new instance } ... }
Вместо восстановления состояния в onCreate() вы можете реализовать метод onRestoreInstanceState(), который система вызывает после метода onStart(). Система вызывает onRestoreInstanceState() только при наличии сохраненного состояния для восстановления, и поэтому вам не нужно проверять, имеет ли Bundle значение null:
public void onRestoreInstanceState(Bundle savedInstanceState) { // Always call the superclass so it can restore the view hierarchy super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); }
Внимание! Реализацию суперкласса onRestoreInstanceState() следует вызывать во всех случаях, чтобы реализация по умолчанию могла сохранить состояние новой иерархии.

Допустимо ли размещать цикл внутри условия?

if (numStr[0] === '-') { result = negativeNum(numStr); } else { for (let i = length(numStr) - 1; i >= 0; i -= 1) { result += numStr[i]; } }


Ответ

Если обратиться к спецификации, конструкция if имеет следующий вид
if ( Expression ) Statement else Statement
В свою очередь Statement может быть следующими конструкциями:
Statement: BlockStatement VariableStatement EmptyStatement ExpressionStatement IfStatement BreakableStatement ContinueStatement BreakStatement ReturnStatement WithStatement LabelledStatement ThrowStatement TryStatement DebuggerStatement
В этом списке интересен BreakableStatement
BreakableStatement: IterationStatement SwitchStatement
Который в итоге приводит нас к циклам
IterationStatement: ... for(LexicalDeclaration Expression; Expression) Statement ...
Отсюда видно, что размещение цикла внутри любой из ветвей условного оператора вполне допустимо.

Правильная проверка обычной переменной на вхождение в enum.

Доброго времени суток. Ситуация следующая, с сервера приходит пакет, в определённом поле которого есть байт, который я хочу передавать в метод как член определённого enum’а. Для приведения я использую статик каст, но я задумался о том, что будет, если сервер пришлёт мне некорректные данные и значение в этом байте окажется за пределами enum’а. Накидал тестовый код и как оказалось С++ спокойно это проглотит и не чего не бросит (.
enum class MyEnum { Red = 1, Black = 2, White = 3 }; void Foo(MyEnum val) { std::cout << static_cast(val) << std::endl; };
int main() { Foo(MyEnum::Red); Foo(static_cast(3)); Foo(static_cast(5)); system("PAUSE"); return 0; }
Есть ли какие-то стандартные средства эффективно (с точки зрения производительности) проверить вхождение значения в конкретный enum и дать мне возможность бросит исключение. Если их нет, то как это сделать, не перелопачивая весь enum руками. И можно ли как то сделать foreach обход enuma не городя огород (что то типа for (auto i : MyEnum) ...)?
p.s. С++ 14 компилятор GCC 6.3.


Ответ

Я тут для вас кое что сооброзил, не знаю насколько поможет. Вам придется просто после добавления в перечислении, добавлять и в оператор ++
#include #include using namespace std; enum class Some { min, s1 = 3, s2 = 5, s3 = 7, max = 9, end = 100 }; Some& operator++(Some& s) { switch(s) { case Some::min: return s = Some::s1; case Some::s1: return s = Some::s2; case Some::s2: return s = Some::s3; case Some::s3: return s = Some::max; case Some::max: s = Some::end; } return s; }
int main() { int n = 5, index; Some t = Some::min; while (int(t) != n && t != Some::end) { ++t; ++index; } if (t == Some::end) cout << "indefined" ; else cout << index; // выдаст 2
return 0; }
Ну можно это все проделать в какой то функции, или на основе этого создавать класс - итератор. Тут index будет иметь значение как индекс в векторах...

MongoDB, поиск по регулярному выражению

Добрый день! В документе есть поле size (строка) вида 134-140, 140-146 и тп. Делаю запрос
var s = "134"; var reg = new RegExp (`[${s}]`, "i"); collection.find({size:{$regex:reg}}).toArray(function(err, result){ console.log(result); });
По идее, должно вернуть все документы, где в поле size встречается цифры 134 (точнее строка). Но возвращает абсолютно все документы. Что я делаю не так?
П.С. после многочисленных тестов я определил, что возвращаются не все документы, а только те, где встречается хотя бы один символ из регулярного выражения. В данном случае 134. Так, будто квадратных скобок нет. Версия MongoDB-сервера 3.0, модуль версии 3.0


Ответ

var reg = /134/; collection.find({ size: { $regex: reg, $options: 'i' } })
UPD:
var s = "134"; var reg = ".*" + s ".*"; collection.find({ size: { $regex: reg, $options: 'i' } })

Как мне анимировать prepend?

Хочу чтобы не сразу появлялся prepand, а немного анимировано: появлялся не так быстро и справа налево.
Вот моя реализация:
$('.client').hover(function() { $(this).prepend('

Remove
').show('fast') }, function() { $('.remove').remove(); }); $('body').on('click', '.remove', function() { $(this).parent().remove(); }) .panel { margin: 10px; } .remove { float: right; }

Фамилия имя: Иванов Иван

Телефон: +7911111233

email: test@mail.ru

Фамилия имя: Иванов Иван

Телефон: +7911111233

email: test@mail.ru

Фамилия имя: Иванов Иван

Телефон: +7911111233

email: test@mail.ru


То есть мне нужен вот этот код преобразовать $(this).prepend('
Remove
').show('fast')


Ответ

Нет смысла всякий раз при hover создавать элемент и анимировать его JS-ом. Если не хочется лопатить разметку, можно .remove просто добавить в блоки по готовности документа, а дальше css сделает своё.
$('body').on('click', '.remove', function() { $(this).parent().remove(); }) *{ box-sizing:border-box; } body{ margin:0; } .panel { margin: 10px; } .client{ position:relative; overflow:hidden; } .caption{ padding-right:80px; } .client .remove{ display:inline-block; position:absolute; right:-50px; top:30px; cursor:pointer; opacity:0; transition:all .3s ease; } .client:hover .remove{ right:10px; opacity:1; }

Фамилия имя: Иванов Иван

Телефон: +7911111233

email: test@mail.ru

remove

Фамилия имя: Иванов Иван

Телефон: +7911111233

email: test@mail.ru

remove

Фамилия имя: Иванов Иван

Телефон: +7911111233

email: test@mail.ru

remove

Реализовать появление изображения на фоне пункта меню

Как можно реализовать появление картинки на фоне пункта меню? Как на скрине.

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


Мой css код:
.menu { padding:0; margin:0; display:block; }
.menu li { font-family: 'Mensch-Regular'; float:left; display:block; width:100%; text-align:center; font-size:24px; margin-top:32px; }
.menu a { margin:20px; color:#4d4d4d; text-decoration:none; }


Ответ

Вроде не сложно , в два псевдоэлемента
* { margin: ; padding: ; list-style: none; text-decoration: none; } html, body { font-family: "Times New Roman", sans-serif; font-size: 1.3em; } ul { display: flex; } li { margin-left: 10px; position: relative; z-index: 100; } li:hover:after { content: ""; display: inline-block; width: 100%; height: 50%; position: absolute; top: 5px; left: -10px; z-index: -1; border-top: 20px solid red; border-left: 10px solid transparent; border-right: 10px solid transparent; height: 0; } li:hover:before { content: ""; display: inline-block; width: 100%; height: 50%; position: absolute; top: 10px; left: -10px; z-index: -1; border-bottom: 20px solid red; border-left: 10px solid transparent; border-right: 10px solid transparent; height: 0; }


https://codepen.io/topicstarter/pen/geabdb?editors=1100 с изменением цвета ссылки

Анимация фигуры на CSS/JS


Это png фигура находится в шапке сайта. Как можно реализовать плавное вращение коричневых кругов вокруг чёрного? Я не прошу дать мне готовый код, просто подскажите, какой библиотекой JS воспользоваться. И возможно ли это вообще, не рисуя gif?


Ответ

Для таких задач можно использовать SVG

Как получить название антивируса в переменную C#

Как получить название антивируса в переменную на языке C#


Ответ

Если пользоваться WMI, то можно сделать так:
var searcher = new ManagementObjectSearcher("root\\SecurityCenter2", "SELECT * FROM AntiVirusProduct");
// это цикл по найденным антивирусам foreach (ManagementObject queryObj in searcher.Get()) { string displayName = (string)queryObj["displayName"]; // имя Console.WriteLine($"Antivirus: {displayName}");
uint productState = (uint)queryObj["productState"]; uint secutityProvider = (productState & 0xff0000) >> 16; // что умеет
Console.Write("Security provider:"); if ((secutityProvider & 1) != 0) Console.Write(" firewall"); if ((secutityProvider & 2) != 0) Console.Write(" autoupdate settings"); if ((secutityProvider & 4) != 0) Console.Write(" antivirus"); if ((secutityProvider & 8) != 0) Console.Write(" antispyware"); if ((secutityProvider & 16) != 0) Console.Write(" internet settings"); if ((secutityProvider & 32) != 0) Console.Write(" user account control"); if ((secutityProvider & 64) != 0) Console.Write(" service"); Console.WriteLine();
uint realtimeStatus = (productState & 0xff00) >> 8; // realtime-защита Console.Write("Realtime status: "); switch (realtimeStatus) { case 0x00: Console.WriteLine("off"); break; case 0x01: Console.WriteLine("expired"); break; case 0x10: Console.WriteLine("on"); break; case 0x11: Console.WriteLine("snoozed"); break; default: Console.WriteLine("unknown"); break; }
uint signatureStatus = (productState & 0xff); // состояние сигнатур Console.Write("Signature status: "); switch (signatureStatus) { case 0x00: Console.WriteLine("up to date"); break; case 0x10: Console.WriteLine("oout of date"); break; default: Console.WriteLine("unknown"); break; } }
Источник: https://gallery.technet.microsoft.com/scriptcenter/Get-the-status-of-4b748f25
Если вам нужно только имя, и вы уверены, что антивирус на системе ровно один, можно упростить до
string name = (string) (new ManagementObjectSearcher("root\\SecurityCenter2", "SELECT * FROM AntiVirusProduct") .Get().Cast().Single()["displayName"]);

Как закрыть Socket?

есть отдельный поток класс который работает с Socket-ом.Когда я отключаю клиент он все равно продолжает работать. Метод socket.isClosed() возвращает false а socket.isConnected() true хотя клиент давно уже отрублен.Как можно закрыть этот Socket? Есть мысли отправить сигнальный текст из клиента чтобы закрыть соединение типа :
String line = bufferedReader.readLine(); if(line.equals("exit")){ socket.close(); }
но я не могу использовать readLine() так как из клиента я отправляю только тогда когда получаю данные от сервера.Как это можно реализовать?помогите пожалуйста.Вот код который есть сейчас.На самом деле кода тут очень много ,я написал самую главную логику.
@Override public void run() {
try(PrintWriter out = new PrintWriter(socket.getOutputStream(),true); BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream(), Charset.forName("cp1251")))){
while(true) {
out.println("soobshenie s servera"); out.flush();
if((socket.isClosed())||(!socket.isConnected())){ socket.close(); System.out.println("поток завершен"); break; } } } }


Ответ

Методы isConnected() и isClosed() в Java работают немного не так, как вы представляете.
Метод isConnected() возвращает true тогда, когда сокет хоть раз был connected. Даже если сокет уже давно закрыт, isConnected() будет true
Метод isClosed() возвращает true, когда сокет был хоть раз закрыт. Если сокет никогда не был подключен, isClosed() вернет false, даже не смотря на то, что по факту он не открыт.
Следовательно, вот так вот можно проверить, подключен ли сокет к серверу на текущий момент.
boolean connected = socket.isConnected() && !socket.isClosed();

Проблемы с Null-коалесцентным оператором

Правильно ли я понимаю, что следующие конструкции должны быть эквивалентны:
MeshCollider collider = go.GetComponent(); MeshCollider meshCollider = collider != null ? collider : go.AddComponent();
и
MeshCollider collider = go.GetComponent(); MeshCollider meshCollider = collider ?? go.AddComponent();
Если да, то почему первая конструкция работает, а во второй я получаю null?
EDIT: Давайте так:
MeshCollider collider = go.GetComponent(); //Выводит True, логично поскольку MeshCollider ещё не установлен Debug.Log(collider == null); //Выводит False, логично поскольку MeshCollider ещё не установлен Debug.Log(collider != null);
MeshCollider newCollider = go.AddComponent(); //Выводит False, логично поскольку MeshCollider теперь установлен Debug.Log(newCollider == null); //Выводит True, логично поскольку MeshCollider теперь установлен Debug.Log(newCollider != null);
MeshCollider meshCollider1 = collider != null ? collider : newCollider; MeshCollider meshCollider2 = collider == null ? newCollider : collider; MeshCollider meshCollider3 = collider ?? newCollider;
//Не логично //Выводит Test (UnityEngine.MeshCollider), Test (UnityEngine.MeshCollider), null Debug.LogFormat("{0}, {1}, {2}", meshCollider1, meshCollider2, meshCollider3);


Ответ

Как и предполагал @АртёмОконечников в комментариях - проблема в перегрузке операторов == и !=
Конструкция ?? сравнивает экземпляр левого операнда с null
Но разработчики Unity решили переопределить UnityEngine.Object.operator == так, чтобы 'неинициализированный' экземпляр (который !destroyed) UnityEngine.Object и всех его потомков возвращал true при сравнении с null
Например:
MeshCollider collider = new MeshCollider(); print(collider == null); //Выведет True
Таким образом конструкция ?? работает не так как ожидается, если операторы сравнения перегружены

Перегрузка операций и приоритет

Имеется три объекта одного класса с перегруженными операциями + и *. Сохранят ли эти операции приоритет или нет? Почему? Например:
rezult = a + b * c.
Где a, b, c - объекты одного класса. Какая будет последовательность выполненных операций и почему?


Ответ

В С и С++ приоритет операций диктуется грамматикой языка и наследуется из грамматики языка. Грамматике языка не интересно, встроенные ли это операторы или перегруженные.
Приоритет операций в общем случае не имеет никакого отношения к последовательности выполнения операторов. Но именно для перегруженных операторов такая связь имеется - перегруженные операторы выполняются именно в порядке их приоритета.
Если считать, что все операторы в данном выражении перегружены, то сначала будет выполнено умножение b * c, затем сложение a + ..., и затем - присваивание result = ....

Заглушка для картинки

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


Ответ

C атрибутом

На JQuery $('img').on('error',function(){ $(this).attr('src', 'https://i.mycdn.me/image?id=814327925848&t=0&plc=WEB&tkn=*GsdCWAmDvjL9x0vo-r1OjNdHSKY'); }) asd

Как правильно модифицировать базовый конструткор?

Мучаю наследование. Стакнулся на моменте использования конструктора базового класса в производном.
Базовый класс:
namespace ConsoleApp12 { class Employee { public string Name { get; set; } public float Pay { get; set; } public int Age { get; set; } public Employee() {
} public Employee(string name, int age, float pay) { Name = name; Age = age; Pay=pay; }
} }
Производный:
namespace ConsoleApp12 { class Manager : Employee { public int SalaryIndex { get; set; } public Manager(int salIndex) : base(name, age, pay) {
} } }
Получаю ошибку:
Кто может объяснить что я делаю не так?


Ответ

Вы вызываете конструктор базовогo класса, передавая туда в качестве параметров переменные, которых в этом месте нет.
class Manager : Employee { public int SalaryIndex { get; set; }
public Manager(int salIndex) : base() { SalaryIndex = salIndex; }
public Manager(int salIndex, string name, int age, float pay) : base(name, age, pay) { SalaryIndex = salIndex; } }

Как в Java из строки сделать список чисел?

Есть строка с цифрами от 0 до 9, без пробелов. На выходе должен получиться список int, при чем если после какой-то единицы стоит ноль, то такие ноль и единица должны быть записаны в списке как 10. Таким образом не выходе должен получиться список из чисел от 1 до 10. Как это сделать?


Ответ

Извлечение чисел от 0 до 10 из потока циферь. Главное сформулировать условие, когда заканчивается одно число и начинается другое. Если на предыдущей итерации получена единица и сейчас перед нами ноль, то мы всё ещё находимся на том же самом числе (на десятке). В остальных случаях мы перешли на следующее число. Когда случился переход на следующее число, предыдущее надо вывести (поместить в массив)
// чтобы просто переводить символы в числа/цифры public static Map CHAR2DIGIT = new HashMap() {{ put('0', 0); put('1', 1); put('2', 2); put('3', 3); put('4', 4); put('5', 5); put('6', 6); put('7', 7); put('8', 8); put('9', 9); }};
public static List numbers(String input) { List numbers = new ArrayList<>();
int number = -1; // сюда будем собирать очередное число. -1 когда находимся в самом начале потока и ещё не получено ни одной цифры for (int i = 0; i < input.length(); i++) { int digit = CHAR2DIGIT.get(input.charAt(i)); // очередная цифра
if (digit != 0 || number != 1) { // условие перехода на следующее число if (number > -1) numbers.add(number); // вывод предыдущего number = 0; // сброс для расчёта нового числа }
number = number * 10 + digit; // незамысловатая формула для сбора числа из его циферь } if (number > -1) numbers.add(number); // не забыть вывести последнее число после цикла
return numbers; }
public static void main(String[] args) {
for (Integer n : numbers("1234567891001")) { System.out.println(n); } }

интерфейсы runnable и callable

Чем отличаются два интерфейса для реализации задач Runnable и Callable? Какая необходимость иметь оба, если Callable может делать все, что делает Runnable?


Ответ

Интерфейс Callable похож на Runnable, поскольку оба они предназначены для классов, экземпляры которых потенциально выполняются другим потоком. Однако Runnable не возвращает результат и не может выставить проверенное исключение.
Информация взята из документации - ссылка

Мокинг статических методов. Когда это нужно делать?

Ранее как-то особо не обращал внимание на статические методы и сейчас когда вижу, что для некоторых (иногда даже кажется что для большинства) мне не нужно задавать/хранить состояние, то решил сделать их статическими. Но становиться вопрос, что тогда на счет мокинга этих методов в классах, где они являются зависимостями, ведь в интерфейсе нельзя объявить статический метод и соответственно другую реализацию подсунуть становить затруднительно стандартными средствами.
Например, есть код
public class Hasher { public static void RenameByHash(string filePath) { //... } }
public class MyService { public void ProccessPres(string presentationPath) { //...
Hasher.RenameByHash(presentationPath);
//... } }
Я ведь теперь при тестировании метода ProccessPres() не могу замокать Hasher.RenameByHash(). И прихожу к тому, что приходиться вообще отказаться от статических методов, т.к. не могу изолировать их поведение и тестировать только свой сервис.
Мокинг приватных методов. Быть может мне необходимо понять какие-то концептуальные вещи касаемо статических методов. К примеру, я как-то пытался делать юнит-тест для приватного метода, пока один чувак на форуме внятно не дал понять, что это неправильно с концептуальной точки зрения и нужно тестировать только публичные метода класса, которые являются API этих классов, тем с помощью которого к нему стучится внешний мир. Да, это тоже не догма, наверное, и для приватных методов иногда нужны юнит-тесты, но я этого избегаю.
Фреймворки для мокинга статических методов. Также есть статья в которой говорится, что для мокинга статических методов можно использовать более навороченные мокинг-фреймворки типа Typemock, JustMock, Moles. Но насколько нужно это мне, как я писал выше, было бы ясно если я убедился бы в том, что правильно понимаю теоретическую основу статических методов касательно их имитации. Быть может мокать поведение статические методов в большинстве случаев и вовсе не нужно как не нужно мокать приватные методы.


Ответ

Имхо, статические методы должны
1) Делать очень маленькую специфичную работу 2) Не должны напрямую относиться к бизнес логике 3) Как следствие 1) и 2) - их не надо мокать 4) Их можно тестировать отдельно
По большому счету они очень похожи на расширяющие методы.
Например,
string.IsNullOrEmpty(...) DateTime.ConvertToLocalTIme(...)
Но если у вас есть какой то бизнес класс, который не обладает состоянием (например, какой то сервис отсылки сообщений или калькулятор стоимости товара или что то подобное), то есть смысл делать его синглтоном, то есть иметь только 1 экземпляр такого сервиса на всё приложение/домен/подсистему и тд.
Я предпочитаю делать синглтоны за счет инверсии зависимости. То есть класс сам не знает, что он синглтон - это указывается в корне композиции при регистрации типов в IoC контейнере или вручную. Таким образом, классы без состояния можно тестировать как любые другие классы.
UPD
На самом деле, если заходить дальше, то ваши подсистемы по идее должны взаимодействовать посредством контрактов (это такая общая рекомендация), что обычно означает интерфейсов. Грубо говоря, при использовании IoC весь необходимый для класса воспомогательный бизнес функционал должен быть инжектирован через конструтор, свойство или каким либо другоим методом (я почти всегда выбираю конструктор). То есть используюя какой то бизнес функционал, ваш класс должен вызвать метод какого либо инстанса (ведь вы не можете инжектировать статический класс/метод). Таким образом мы приходим к тому, что вызов статического метода стороннего класса идет в разрез с принципом инверсии зависимости.
С другой стороны, преобразование обычного класса (или его пубичного метода) в статический увеличивает связность классов, так как интерфейсы не содерджат статических методов, а значит вызвать статический класс/метод вы можете только явно. То есть делая класс или его публичный метод статическим, вы уменьшаете гибкость системы вцелом. Потому есть смысл это делать только в тех случаях, когда у таких классов/методов в приципе возможна только одна имплементация, которая не содержит состояния и которую вы точно не захотите менять никогда (string.IsNullOrEmpty четко дает понять, что происходит внутри метода и другой реализации этого метода быть не может) - то есть в таких случаях вы жертвуете гибкостью там, где она в принципе не нужна. Во всех остальных случаях я стараюсь избегать модификатора static вообще.
Что же касается внутренней реализации класса - приватных статических членов, это уже другой разговор, тут уже можно делать статическим все, что удобно, так как это внутренняя кухня класса (особенно если от этого класса запрещено наследование).