Страницы

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

пятница, 19 апреля 2019 г.

Работа resolve в promise

Есть такой код, один аспект которого мне не понятен:
'use strict'; let promise = new Promise((resolve, reject) => { resolve("Промис завершился"); console.log("Промис ждет, пока я появлюсь"); }); promise .then( result => console.log("Fulfilled: " + result), error => console.log("Rejected: " + error) );
Собственно, не понятно то, что алерт в функции-конструкторе вообще отрабатывает своё и появляется. И сразу же за ним (это прям вообще не понятно - почему за ним?) появляется "промис завершился". Не понятно по какому принципу работает resolve(), то есть передается управление обработчику .then Я много раз видел, когда resolve() помещали конкретно внутрь обработчика onload (для ajax запросов, например), который сам по себе говорит о завершенности выполнения вопроса. А получается, что resolve() можно запихнуть хоть с самого начала и код ниже всё равно отработает. Да, конечно, в случае с ajax можно ожидать отклонение запроса сервером, поэтому нужно использовать resolve() в случае успеха, а reject() в случае ошибки. Помогите разобраться.


Ответ

В JS остановить функцию может только или return, ошибка или её конец. Почитать
В ожидании используется некий асинхронный подход (иначе не вышло бы отлавливать асинхронные операции, Ваш КО): при разрешении обещания, коллбэк встаёт в очередь до завершения ожидающего кода в функции и только потом вызывается.
Если Вам этого не нужно, используйте return: return resolve();

Как найти директорию с файлами страницы Virtuemart?

Как узнать директорию в исходниках в Joomla с компонентом Virtumart, если нужно найти одну страницу, например меню сайта, как на сайте dallat.ru/food-menu?


Ответ

Сам компонент лежит в /components/com_virtuemart
А меню сайта может быть и от самой Joomla. Ищите его в папке с действующим шаблоном, в том числе среди overrides.
/templates/vina_incomeup и т.д.
Либо это может быть отдельный модуль типа Megamenu - вывод которого также изменяется через overrides.

Нахождение числа бинарным поиском - вычисление максимального и минимального количества операций

Добрый день,
Хочется понять как высчитать минимальное и максимальное количество операций для нахождения произвольного числа в определенном промежутке значений. Код для примера (C#):
using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions;
namespace Rextester { public class Program { public static void Main(string[] args) { Random r = new Random(); int min = 2047; int max = 4096; int val = min; int counter = 0; int i = r.Next(2047, 4096); while(true) { Console.WriteLine("--> "+val); if(i == val) break; val = (max-min)/2 + min; if(i>val) { min = val; } else if(i
The calculated i is: "+val+", but i is: "+i+", done in "+counter+" counts.




"); } } }
В данном примере я вижу, что максимальное количество операций для нахождения числа в промежутке между 2047 и 4096 - это 11 (эмпирически, основано на 10000 запусках). Как это посчетать без запуска? Где можно почитать теоритическое обьяснение?
Спасибо!


Ответ

Так как Вы с каждой операцией отсекаете половину возможных чисел, то количество операций будет равно log(n, 2) (логарифм от n по основанию 2), где n - разница между максимом и минимумом

посмотреть команды в package.json

Какая команда в консоле, чтобы посмотреть список доступных скриптов.
Допустим есть секция со скриптами:

раньше я набирал npm ls или что то вроде этого - вроде и видел список скриптов.


Ответ

Для того, чтобы вывести список доступных скриптов можно использовать команду
npm run
npm run-script [-- ...] alias: npm run Описание Запускает указанную команду и объекта "scripts" в package.json. Если "command" не указан, будет выведен список доступных скриптов.

Упрощенное/приближённое представление чисел с плавающей точкой как дробей в SymPy

Как представить в 8/9 * x или 8 * x/9 с помощью методов sympy след. выражение? Как показывает пайтон так точнее и самому приятнее смотреть :)
0.888888888888889 * x


Ответ

import sympy x = sympy.Symbol('x') print(sympy.nsimplify(0.888888888888889 * x))
Вывод: 8*x/9
http://docs.sympy.org/0.7.1/modules/simplify/simplify.html#nsimplify

Удаление пустых папок

Задача - удалить пустые папки. Код внизу удаляет только последнюю папку и отключается. Но, после удаления последней папки, папка, в которой она находилась тоже становится пустой. Как заставить скрипт после удаления последней папки проверять ту папку, из которой он удалил последнюю и удалял ее?
def del_empty_dirs(path): for d in os.listdir(path): a = os.path.join(path, d) if os.path.isdir(a): if not os.listdir(a): os.rmdir(a) print(a, 'удалена') else: del_empty_dirs(a)


Ответ

Вам нужен поиск в глубину.. Сначала углубляемся в рекурсию, только потом что-то проверяем/удаляем:
def del_empty_dirs(path): for d in os.listdir(path): a = os.path.join(path, d) if os.path.isdir(a): del_empty_dirs(a) if not os.listdir(a): os.rmdir(a) print(a, 'удалена')
Таким образом, мы гарантируем, что по выходу из рекурсивного вызова - все дочерние папки уже обработаны.

Как получить текущее время?

Какой метод/модуль использовать, чтобы получить текущее время в Python? Перевод вопроса "How to get current time in Python"


Ответ

Импортируем модуль datetime
>>> import datetime
Получаем дату:
>>> datetime.datetime.now() datetime(2009, 1, 6, 15, 8, 24, 78915)
Только время:
>>> datetime.datetime.time(datetime.datetime.now()) datetime.time(15, 8, 24, 78915)
То же, только компактнее:
>>> datetime.datetime.now().time()
Быстрое представление
См. документацию по datetime

Можно импортировать datetime объект из datetime модуля:
>>> from datetime import datetime
Тогда можно убрать первый datetime из примеров:
datetime.datetime.now().time() => datetime.now().time()

Строковое представление можно получить из time.strftime() и time.gmtime()
>>> from time import gmtime, strftime >>> strftime("%Y-%m-%d %H:%M:%S", gmtime()) '2009-01-05 22:14:39'
Или даже так:
>>> from datetime import datetime >>> str(datetime.now()) '2011-05-03 17:45:35.177000'

Как сделать 30 секундную заглушку

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


Ответ

LOADING .... (можно вставить картинку с анимацией)

как обратиться к динамическому css селектору

генерируется css идентификаторы (просто добавляется порядковый номер например
#id, #id1, #id2, #id3,
как в css обратиться к этим идентификатором, может есть что то типа этого?
#id[*] {.....}


Ответ

Ресурс:
Возможны варианты, когда стиль следует применить к тегу с определённым атрибутом, когда частью его значения является некоторый текст. При этом точно не известно, в каком месте значения включен данный текст — в начале, середине или конце. В подобном случае следует использовать конструкцию *=. Она определяет, что значение атрибута содержит указанный текст.
[id*=id] { ... }
Пример:
/* Для наглядности */ #id1 { background: #ccc; } #id2 { background: #ddd; } #id3 { background: #ccc; } #id4 { background: #eee; } #id5 { background: #333; } /* Ко всем */ [id*=id] { height: 100px; }


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

Написал вот такой тест
// the domain is 'test.dev' function test (str) { rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/)/, "/"); console.log('Was: ' + str + '
Now: ' + rep); } test("http://test.dev/path?query=string"); test("https://test.dev/"); test("//test.dev"); test("//test.dev/?query=string");
, который работает и выдает
Was: http://test.dev/path?query=string Now: /path?query=string
Was: https://test.dev/ Now: /
Was: //test.dev Now: /
Was: //test.dev/?query=string Now: /?query=string
Но ссылка может быть еще и такого вида (без слэша перед началом query string): //test.dev?query=string, и тогда регулярка выше не срабатывает. Как бы в нее попроще этот вопросительный знак воткнуть?
Из //test.dev?query=string должно получиться /?query=string
Придется дополнить вопрос. Исходные ссылки могут быть не только на test.dev, но и на другие сайты (например, test.devil). Такие ссылки нельзя превратить в относительные, точнее можно, но это не будет иметь смысла по отношению к сайту test.dev, поэтому они должны оставаться как есть.


Ответ

Предлагаю заменить rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/)/, "/"); на
rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/|(\?))/, "/$1"); ^^^^
Добавив захватывающую подмаску (\?) в качестве ещё одной альтернативы в незахватывающую группу, можно отловить знак вопроса, а потом с помощью обратной ссылки $1 в шаблоне замены восстановить его в получаемой строке.
function test (str) { rep = str.replace(/^(?:https?:)?\/\/test\.dev(?:$|\/|(\?))/, "/$1"); console.log('Was: ' + str + '
Now: ' + rep); } test("http://test.dev/path?query=string"); test("https://test.dev/"); test("//test.dev"); test("//test.dev/?query=string"); test("//test.dev?query=string"); // /?query=string

Какие типы данных и в каком виде можно передавать через TCP bsd socket?

Во всех примерах использования bsd сокетов на си для передачи и приема информации используется массив символов фиксированной длинны char buff[255]. Например read(socketFD, buff, sizeof(buff));. Возникает пара вопросов:
Обязательно ли использовать массив char, или же можно передавать произвольные объекты? например можно ли передать double buff[255] или даже struct someStructType buff[255]? Что будет, если отправить массив например в 200 элементов, а на принимающей стороне считать только 100? При повторном чтении мы прочитаем те же элементы, или же следующие 100 элементов?


Ответ

В сокет передаются исключительно байты, что бы ваши объекты превратить в байты или создать их из них нужно использовать протоколы сериализации, такие как например T-L-V или ProtoBuf. В примерах приводится массив-буфер для считывания в него информации, как правило функция чтения возвращает реальное количество считанных байт. Если вы отправите 200 байт, а считаете 100, то вам надо будет считать потом еще 100. Буфер может быть любого размера (но как правило его делают не более MTU/MRU). Как правило при обмене данными через сеть, они упаковываются в пакет вида: packetLength:packetData, что позволяет гарантированно считывать переданный пакет. Так, например, отправляя 200 байт нужной информации вы:
Считываете в буфер приема данные из сокета. Читаете из этого буфера длину пакета packetLenght (сколько байт - зависит от типа переменной и архетиктруры); Создаете буфер размером packetLength. Это не тот же самый буфер в который вы читаете из сокета!! Копируете из буфера приема данные в созданный буфер, при этом если размер данных меньше, чем осталось в буфере, то копируете нужно кол-во, если больше, то пишите все, а затем дочитываете далее из сокета в буфер приема до тех пор, пока не вытащите все.

Переопределение метода экземпляра класса

Мне нужно переопределить метод класса Button
public class Button { public void action(){} }
Я пробовал инициализировать так:
Button home = new Button(){ public void action() { // TODO some code } }
Но ничего не получилось. Нужна помощь.


Ответ

Но ничего не получилось.
А в чем заключается это «не получилось»? Если при вызове переопределенного метода Вы получаете cannot resolve method, то, может быть, Вы импортировали вовсе не Ваш класс Button, а одноименный класс из другого пакета, который данного метода не имеет?
При создании экземпляра некоторого класса Вы можете переопределить его методы, в итоге получите анонимный класс (а точнее, субкласс).
Пример:
class Button { public void action() { System.out.println("Basic implementation"); } }
public class Main {
public static void main(String[] args) { Button button = new Button() { @Override public void action() { System.out.println("Overridden implementation"); } };
button.action(); } }
Вывод на консоль:
Overridden implementation
Если же класс с переопределенными методами будет использован многократно, то целесообразно создать именованный класс.

Android Studio ошибка запуска приложения на своем девайсе (Xiaomi)

Пытаюсь запустить приложение на своем девайсе но постоянно выскакивает эта ошибка


Ответ

Это типовая ошибка для телефонов Xiaomi, пишут, что надо сделать так:
Активировать режим разработчика на телефоне: Настройки->О телефоне->и нажать 7 раз на MIUI версию Идем опять в настройки, дополнительные настройки, настройки разработчика и включаем отладку через USB Подключаем телефон к компу - при первом подключении на телефоне выскочит уведомление с просьбой авторизовать подключенный комп - принимаем авторизацию Идем обратно в настройки разработчика, включаем оптимизацию MIUI и выключаем ее - после этого телефон перезагрузится. Пробуем еще раз.
Пункты 1-2 - самоочевидные, 3-4 важные пункты (шаг 3 также актуален для Samsung'ов) - 4 - чисто для Xiaomi
Цынк
P.S.
В общем то он говорит, что такое приложение уже стоит, и если вы нажмете "ок" - он удалит установленное приложение вместе с данынми, относящимися к этому приложению и установит то, что вы хотите.
Неправда, пишет, что возможно поможет снос приложения.
Если не ошибаюсь это означает, что приложение с таким именем и пакетом уже есть на устройстве, но подписано другими ключами. Удалите его через Настройки андроида и можно будет ставить с Ее
Ошибаетесь - совсем не об этом пишет.

Определение пола по фио на python

Подскажите, пожалуйста, алгоритм определения пола по ФИО. Может есть на питоне какие-то решения? Я пробовал: 1-по окончаниям; 2-с помощью pymorphy разбивал ФИО на слова и определял род каждого слова. Есть еще какие-нить библиотеки или может алгоритм? ФИО могут быть не только русские.


Ответ

Мой вариант - это пробегаться по базе данных и спрашивать есть ли совпадения:
Сначала достанем базу данных на этом сайте
В левом окне в шаге 3 выберем Russian (Cyrillic) - в правом я выбираю United States, для генерации укажем только интересующие нас поля: Gender, Given Name и Surname, саму базу сделаем самой большой: 50000
Также давайте закажем для генерации базу и для английских имён по аналогии.
Процесс не быстрый, так что можно пойти заварить чаёк и выкурить сигаретку. Как придём, нам придёт 2 письма со ссылками на скачивание наших БД.
Напишем код:
import pandas as pd
dfru = pd.read_csv('FNru.csv') dfen = pd.read_csv('FNen.csv')
# создадим сеты, чтобы не бегать по одному и тому же item'у
rumalenames = set(dfru[dfru['Gender'] == 'male']['GivenName']) rumalesurnames = set(dfru[dfru['Gender'] == 'male']['Surname'])
rufemalenames = set(dfru[dfru['Gender'] == 'female']['GivenName']) rufemalesurnames = set(dfru[dfru['Gender'] == 'female']['Surname'])
enmalenames = set(dfen[dfen['Gender'] == 'male']['GivenName']) enmalesurnames = set(dfen[dfen['Gender'] == 'male']['Surname'])
enfemalenames = set(dfen[dfen['Gender'] == 'female']['GivenName']) enfemalesurnames = set(dfen[dfen['Gender'] == 'female']['Surname'])
name = input('Name: ') surname = input('Surname: ')
if name in rumalenames and surname in rumalesurnames: print(name, surname, 'is male')
elif name in rufemalenames and surname in rufemalesurnames: print(name, surname, 'is female')
elif name in enmalenames and surname in enmalesurnames: print(name, surname, 'is male')
elif name in enfemalenames and surname in enfemalesurnames: print(name, surname, 'is female')
else: print('Unkown data')
Давайте протестируем что у нас получилось на нескольких входных данных:
# Name: Никита # Surname: Токарев # Никита Токарев is male
# Name: Ольга # Surname: Соколова # Ольга Соколова is female
# Name: Жанна # Surname: Токарева # Жанна Токарева is female
# Name: Carolina # Surname: Thompson # Carolina Thompson is female
# Name: Mark # Surname: Watson # Mark Watson is male
# Но решение не идеально, конечно # Требуется либо очень много данных, либо очень хорошая БД # И то не факт, что все имена будут включены
# Name: Олег # Surname: Волоков # Unkown data
# Name: Ashley # Surname: Roth # Unknown data

Получить уникальные значения списка

Есть список:
var list = new List { "строка", "строка22у", "строкайцвцйй", "текстцвцй", "текст", "текстыауке5"};
Нужно удалить элементы, которые содержат в себе другие элементы. Т.е. удалить строки строка22у, строкайцвцйй, т.к. содержат первую строку и текстцвцй, текстыауке5 соответственно. В результате останутся строка, текст
Делаю так:
int removedCount; do { removedCount = 0; for (int i = 0; i < list.Count; i++) { removedCount += list.RemoveAll(x => x.Contains(list[i]) && x != list[i]); } } while (removedCount != 0);
Есть ли более эффективный способ?


Ответ

При большом количество строк (особенно если многие из них имеют одинаковые префиксы) вариант с построением префиксного дерева и поиску по нему должен работать гораздо быстрее. Однако и кода выходит гораздо больше.
Вариант реализации. Метод поиска требуемых строк:
private static List dfa(List list) { var result = new List(); State root = new State(); foreach (string word in list) { State state = root; foreach (char c in word) { state = state.get(c); } state.isFinal = true; } foreach (string word in list) { State state = root; int i = 0; for (; !state.isFinal && i < word.Length; i++) { state = state.get(word[i]); } if (i == word.Length) { result.Add(word); } } return result; }
Вспомогательный класс состояния ДКА с учетом оптимизации:
private class State { private Dictionary transitions; public bool isFinal = false; private char firstChar; private State firstState = null;
public State get(char c) { if (firstState != null && firstChar == c) { return firstState; } if (firstState == null) { firstState = new State(); firstChar = c; return firstState; } if (transitions == null) { transitions = new Dictionary(); } if (transitions.ContainsKey(c)) { return transitions[c]; } State state = new State(); transitions.Add(c, state); return state; } }

Как сохранить принятые json данные?

Помогите разобраться. Все перепробовал и не как не могу сохранить принятые данные в файл. Вот код:
def url(): response = requests.get('https://btc-e.nz/api/3/ticker/usd_rur') print(response.json())


Ответ

Если вам не нужно проверять, что сервер вернул именно JSON формат, то метод .json() можно не вызывать, а сразу сохранить ответ на диск:
#!/usr/bin/env python import shutil import requests
url = 'https://httpbin.org/get' r = requests.get(url, stream=True) r.raise_for_status() r.raw.decode_content = True # support Content-Encoding e.g., gzip with open('response.json', 'wb') as file: shutil.copyfileobj(r.raw, file) # copy in chunks, it works for large files
Код с r.json() загружает JSON документ с http-сервера, распознаёт его целиком в памяти и тут же сохраняет на диск:
#!/usr/bin/env python3 import json import requests
url = 'https://httpbin.org/get' r = requests.get(url) r.raise_for_status() data = r.json() # do not create the result file until json is parsed with open('response.json', 'w', encoding='utf-8') as file: json.dump(data, file, indent=2, ensure_ascii=False)
Опции indent=2, ensure_ascii=False использованы, чтобы для улучшить читаемость для людей.
Первый вариант меньше работы выполняет (и меньше проверок). Второй вариант гарантирует, что ответ как JSON распознать можно и поэтому вероятно является предпочтительным, если особых требований нет.

В чем разница между ExecutorService и ForkJoinPool?

В чем разница между старыми имплементациями ExecutorService из 1.5 и новой ForkJoinPool из 1.7? Что такое можно сделать при помощи ForkJoinPool, чего не сделать с старыми вариантами ExecutorService? Или что проще сделать при помощи ForkJoinPool?


Ответ

Насколько я понимаю разница тут в следующем:
ExecutorService имеет общую очередь задач и некоторое количество потоков, которые забирают по очереди таски и выполняют их. ForkJoinPool имеет некоторое количество потоков, но при этом еще имеет очередь тасков для каждого потока. Поток в процессе работы может дробить задачу на несколько тасков, одну он добавляет к себе в очередь а другую выполняет и это может рекурсивно повторяться. Если другой поток опустошил свою очередь, то он может взять задачи у другого потока, с конца очереди. Описанный механизм называется work-stealing. Это и является ключевым моментом различающим данные thread-pool'ы.
Рекомендуется использовать ForkJoinPool, если у вас есть набор задач, которые рекурсивно повторяются. Это позволяет вовсю использовать work-stealing. Если же задачи никак не разбиваются в процессе работы, то и выгоды никакой не получите, хотя и минусов от использование тоже не встретите.
Больше информации

Порядок работы с таблицами виртуальных методов

Добрый вечер.
Если в классе объявлен виртуальный метод, то компилятор создает таблицу виртуальных методов, объявленных в определении этого класса. Производный класс "получает" эту таблицу при наследовании и записывает туда адреса переопределенных (своих реализаций) виртуальных методов.
В момент создания объекта (наследника через указатель на базовый класс), в базовом классе (совместно с созданием VMT) объявляется виртуальный табличный указатель объекта или vptr.
Сначала vptr объекта наследуется всеми производными классами, до тех пор пока не будет инициализирован адресом VMT того произодного класса, которому принадлежит созданный объект.
При вызове виртуального метода, компилятор через vptr достает фактический адрес виртуального метода из VMT нужного производного класса
То есть компилятор генерирует «скрытый» код в конструкторе каждого класса для инициализации vpointer'ов объектов класса адресами соответствующей VMT.
сначала вызывается конструктор базового класса, инициализирующий vptr адресом VMT базового класса, затем вызывается конструктор производного класса, который перезаписывает значение vptr адресом VMT производного класса. (и так до тех пор пока vptr не будет инициализирован адресом VMT того производного класса, которому принадлежит созданный объект)
Вопросы в следующем:
1) Что подразумевается под инициализацией vptr адресом VMT производного класса? Понятно, что у виртуальных методов есть адреса, которые хранятся в таблице, разве адрес есть непосредственно у VMT класса?
2) В каком порядке при запуске программы происходит создание VMT базового класса, создание VMT производного класса (которая получает VMT базы при наследовании и инициализирует ее элементы адресами своих методов), создание vptr и его инициализация таблицами базового и производных классов?
3) При вызове виртуального деструктора значение vptr тоже инициализируется сначала адресом VMT производного, а затем базового класса?


Ответ

Если в классе объявлен виртуальный метод, то компилятор создает таблицу виртуальных методов, объявленных в определении этого класса. Производный класс "получает" эту таблицу при наследовании и записывает туда адреса переопределенных (своих реализаций) виртуальных методов.
Это верно, с той только оговоркой, что все это делается на этапе компиляции. То есть вышепроцитированное - это то, как может "рассуждать" компилятор в процессе формирования VMT для очередного класса.
1) Что подразумевается под инициализацией vptr адресом VMT производного класса? Понятно, что у виртуальных методов есть адреса, которые хранятся в таблице, разве адрес есть непосредственно у VMT класса?
VMT - это таблица в памяти. У нее есть адрес. Вот ее адрес и хранится в указателе vptr каждого объекта. В указателе vptr у объекта типа SomeClass хранится указатель на VMT класса SomeClass. А уж в таблице хранятся указатели на виртуальные методы класса SomeClass (или его предков).
2) В каком порядке при запуске программы происходит создание VMT базового класса, создание VMT производного класса (которая получает VMT базы при наследовании и инициализирует ее элементы адресами своих методов),
Вопрос не совсем корректно поставлен.
Таблицы VMT для всех классов как правило инициализированы статически, то есть их содержимое известно на стадии компиляции. При запуске программы они уже лежат готовенькие к использованию (в т.наз. сегменте инициализированных данных). Таблицы VMT формирует линкер (хотя возможно и более "позднее" формирование загрузчиком). В любом случае, когда программа фактически запустилась, все VMT уже сформированы. Порядок их формирования никакой роли не играет, ибо от него ничего не зависит.
При создании объектов класса идет работа только с указателями на VMT. Сами VMT при этом никто уже не модифицирует (и не "создает").
создание vptr и его инициализация таблицами базового и производных классов?
Вы сами совершенно правильно описали этот процесс в последовательности вызова конструкторов создаваемого объекта, от базовых к производным. Последним отрабатывает "самый производный" конструктор - конструктор полного объекта - в результате чего в vptr остается правильный указатель на VMT полного объекта.
3) При вызове виртуального деструктора значение vptr тоже инициализируется сначала адресом VMT производного, а затем базового класса?
Деструкция происходит в порядке, обратном конструкции. Сначала отрабатывает тело деструктора полного объекта, а в конце он вызывает деструкторы всех своих базовых подобъектов. Каждый деструктор первым делом ставит vptr на VMT своего класса.
Так работает любой деструктор, поэтому не совсем ясно, зачем вы упоминаете вызов именно виртуального деструктора. Когда деструктор уже начал работу, его виртуальность уже не имеет никакого значения.

map и undefined

Такой код
x = new Array(5); y = x.map((item) => item = 7); console.log(y);
ничего не сделает(выведет 5 undefined);
не если задать массив через цикл то все ОК;
в чем проблема?


Ответ

map обходит массив только по существующим элементам.
В данном случае будет создан массив с 5 дырками. Поэтому применение map здесь ничего не даст.
Кроме того, для заполнения массива, map использовать неверно. Вместо него, лучше использовать fill
x = new Array(5); x.fill(7); console.log(x);

Если же заполнять массив нужно не константным объектом, а зависящим, например, от индекса, можно воспользоваться функцией Array.from
x = Array.from({ length: 5 }, (el, index) => index); console.log(x);

Как в переменную типа TObject сохранить строку?

Как правильно записать это
TIdContext(Clients[0]).Data := 'Client3';
И как потом её можно прочесть?
upd
пробую так, выдаёт access violation
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); begin ResString := Creator.TcpResCreate(ReqString); ....
function PCreator.TcpResCreate(ClientReq : String) : String; // функция в другом юните begin if login then begin if not Assigned(Form1.IdTCPServer1.Contexts) then exit; Clients := Form1.IdTCPServer1.Contexts.LockList; TIdContext(Clients[Clients.Count - 1]).Data := TStringHolder.Create(Req.sessionKey.xPlayer); Form1.IdTCPServer1.Contexts.UnlockList; Result := xxx; ....
procedure TForm1.Button1Click(Sender: TObject); begin TIdContext(Clients[0]).Connection.Socket.Write('message'); IdTCPServer1.Contexts.UnlockList; ....
может дело в создаваемом классе?
upd
перестало выдавать ошибку после того как я убрал,
Clients := TLists.Create; Clients.Free;
Видимо их не надо создавать. А с классом вроде норм все.


Ответ

type TStringHolder = class private fValue: string; function GetValue: string; public constructor Create(aValue: string); property Value: string read GetValue write fValue; end;
constructor TStringHolder.Create(aValue: string); begin fValue := aValue; end;
function TStringHolder.GetValue: string; begin if self <> nil then result := fValue else result := ''; end;
Записать:
TIdContext(IdTCPServer1.Contexts.LockList[0]).Data := TStringHolder.Create('Client3');
Прочитать:
... := TStringHolder(TIdContext(IdTCPServer1.Contexts.LockList[0]).Data).Value;
Не забудьте потом вызвать:
TIdContext(IdTCPServer1.Contexts.LockList[0]).Data.Free; TIdContext(IdTCPServer1.Contexts.LockList[0]).Data := nil;

Правильно ли писать в README.md описания методов?

Есть README.md. Как лучше оформить описание методов? Мне кажется, что сейчас неправильно.
VerticalHorizontalScrollView I did not find the ScrollView with two scrolls and decided to write it myself :D I present VerticalHorizontalScrollView - ScrollView with both scroll directions and little customization! scrollTo (int x, int y) Scroll container to X and Y axis without smooth animation smoothScrollTo (int x, int y) Scroll container to X and Y axis with smooth animation and default speed smoothScrollTo (int x, int y, int speed) Scroll container to X and Y axis with smooth animation and animation duration (ms) setOnScrollListener (OnScrollListener listener) Set listener for scroll action OnScrollListener.onScroll (int x, int y) Current X and Y axis scroll position


Ответ

Описание методов
Вы вообще не должны документировать методы и классы в readme.
Для этой задачи существуют javadoc-комментарии в коде. Такие комментарии в том числе показываются в среде разработки, что гораздо удобнее, чем заглядывать в ридми.
Даже дублировать комментарии из кода в ридми вручную не нужно, потому что вы создадите себе лишнюю работу и неизбежно будете обновлять эти комментарии с задержкой.
Как ещё можно и нужно улучить эти комментарии:
Опишите принимаемые параметры с помощью @param x ... Опишите возвращаемое значение с помощью @return ... Опишите предусловия метода, когда они важны: когда можно вызывать метод, когда нельзя, что необходимо сделать перед этим. Например, что будет, если вызвать smoothScroll в то время, как ещё не закончился другой smoothScroll? Опишите постусловия метода: что получится в результате.
Пример:
/** * Scroll container to X and Y axis without smooth animation * * @param x horizontal coordinate, [0..screen width] * @param y vertical coordinate, [0..screen height] */ public void scrollTo( final int x, final int y) { // code here }
Создаём документацию из кода
В Java есть стандартный инструмент — Javadoc. Он может создавать статические веб-страницы с документацией по коду Java. Эти страницы вы можете деплоить на GitHub Pages вручную или с помощью сервера непрерывной интеграции. Можете использовать облачный сервер Travis, он бесплатен для opensource-проектов.
Что делать с Readme?
Там должны быть совсем другие вещи: описание проекта, лицензия, инструкция по тому, как добавить библиотеку в свой проект.
Подробнее: Как написать хороший README?
Пара советов по code-style для markdown
Ставьте пустую строку после заголовков Объединяйте тематические блоки под одним заголовком и внутри него используйте заголовки на уровень ниже:
# Methods
## scrollTo
## smoothScrollTo
# License Каждое предложение в абзаце начинайте с новой строки. Можно ещё больше дробить предложения, желательно так, чтобы длина строки была не больше сотни символов.

XDocument.Save нету перегрузки string

Проблема заключается в отсутствии перегрузки. В чем может быть проблема ?
List outFiles = new List(); XDocument xDoc = XDocument.Load("files.xml"); XElement root = xDoc.Element("files"); int i = 1; foreach (XElement xe in root.Elements("file")) { if (xe.Element("name").Value + xe.Element("extention").Value == src) { xe.Remove(); continue; } outFiles.Add(new Image { Id = i, Src = xe.Element("name").Value + xe.Element("extention").Value, Selected = false }); i++; }
xDoc.Save("files.xml"); return outFiles;


Ответ

Вы пишете под .NET Core, это не то же самое, что .NET Framework.
.NET Core — это новая платформа, в ней ещё нету всех тех же вызовов, что есть в старом Framework.
Согласно документации, и правда XDocument.Save доступен только с Stream'ом, TextWriter'ом и XmlWriter'ом.
Должно про идее работать так:
using (var stream = File.Create("files.xml")) xDoc.Save(stream);

Символ $ в названии переменной

Хочу прочитать JSON-файл, но возникла проблема: некоторые имена в файле имеют символ $ в названии, что приводит к ошибке "Недопустимый символ в названии"
Подскажите, как быть в таком случае?
Использую Newtonsoft.Json
Часть файла:
$date: { $numberLong: "1493325863000" }
P.S.: Не хочу писать каждый раз что-то вроде obj["$date"]


Ответ

Вы можете использовать JsonPropertyAttribute для того, чтобы указать, какое имя должно использоваться при сериализации/десериализации.
[JsonObject(MemberSerialization.OptIn)] public class MyDate { [JsonProperty("$numberLong")] public string NumberLongStr { get; set; }
public long NumberLong { get { return int.Parse(NumberLongStr); }
set { NumberLongStr = value.ToString(); } } }
P.S. Я не проверяю значение NumberLongStr перед парсингом, код приведён только как демонстрация.

обращение к переменным объекта JavaScript

скажите почему след код не выводит измененое имя и возраст?
var person = (function (name, age) {  var   $name = name,      $age = age;    return {   name: $name,   age: $age,     setName: function (name) { $name = name;},     setAge: function (age) { $age = age;}  };   })('Gregory', 42);   person.setName('Miller'); person.setAge(30);   console.log(person.name); console.log(person.age);
Выхлоп:
Gregory 42


Ответ

Проблема в том, что сеттеры меняют локальные переменные, которые дальше нигде не получаются.
Значения полей name и age устанавливаются один раз и затем не изменяются.
Для исправления, вместо полей можно использовать геттеры
var person = (function(name, age) {   var   $name = name,     $age = age;    return {   get name() { return $name },   get age() { return $age },    setName: function(name) { $name = name; },     setAge: function(age) { $age = age; }   };  })('Gregory', 42);  person.setName('Miller'); person.setAge(30);  console.log(person.name); console.log(person.age);
Либо менять непосредственно поля объекта
var person = (function(name, age) {   return {   name: name, age: age, setName: function(name) { this.name = name; }, setAge: function(age) { this.age = age; }   };  })('Gregory', 42);  person.setName('Miller'); person.setAge(30);  console.log(person.name); console.log(person.age);
но в этом случае стоит следить за возможной потерей контекста вызова

Есть ли возможность вызывать функции с делегата по одной?

Action D_For_reproduct_Functions;
D_For_reproduct_Functions += ReproductExp; D_For_reproduct_Functions += ReproductArcSin; D_For_reproduct_Functions += ReproductNormal; D_For_reproduct_Functions += ReproductLaplasa; D_For_reproduct_Functions += ReproductReley; D_For_reproduct_Functions += ReproductVeibula;
Мне нужно что-то вроде такого
for (int i = 0; i < D_For_reproduct_Functions.Length; i++) { D_For_reproduct_Functions[i]();
KSKolvogorov();
//и тут в будущем KSPirsona }


Ответ

Вы можете разобрать ваш делегат на составные части при помощи GetInvocationList(). Вот пример:
Action combined = () => Console.WriteLine("Func 1");
combined += () => Console.WriteLine("Func 2"); combined += () => Console.WriteLine("Func 3");
var actions = combined.GetInvocationList().Cast(); foreach (var a in actions) { a(); Console.WriteLine("-----"); }

Но раз вам такое понадобилось, возможно, вы делаете что-то неправильно. Думаю, вам реально вместо Action D_For_reproduct_Functions нужно List D_For_reproduct_Functions, и ваш код будет иметь вид
List D_For_reproduct_Functions = new List();
D_For_reproduct_Functions.Add(ReproductExp); D_For_reproduct_Functions.Add(ReproductArcSin); D_For_reproduct_Functions.Add(ReproductNormal); D_For_reproduct_Functions.Add(ReproductLaplasa); D_For_reproduct_Functions.Add(ReproductReley); D_For_reproduct_Functions.Add(ReproductVeibula);
for (int i = 0; i < D_For_reproduct_Functions.Count; i++) { D_For_reproduct_Functions[i](); KSKolvogorov(); }

Очистка памяти динамического массива строк

Доброго времени суток. Есть такая задача. Вводится строка, программа должна разбить ее на лексемы, сохранить их в массив data, выполнить какие-то операции и потом успешно завершится. С алгоритмом проблем нет, но вот очистка памяти не работает. Если что, точно известно: количество слов точно не может быть более 25, длина слова - не более 20 символов.
int main() { char* string = (char*)malloc(sizeof(char) * 500); fgets(string, 500, stdin);
char** data = (char**)malloc(sizeof(char*) * 25); for (int i = 0; i < 25; i++) { data[i] = (char*)malloc(sizeof(char) * 20); }
int length = 0; data[length] = strtok(string, " "); length++;
while (data[length - 1] != NULL) { data[length] = strtok(NULL, " "); length++; }
//Do Something
for (int i = 0; i < length; i++) { free(data[i]); } free(data); free(string); return 0; }


Ответ

Как только вы делаете вот этот финт:
data[length] =
т.е. присваиваете указателю новое значение, старое, указывающее на выделенную память, теряется. Получается утечка памяти.
А затем вы пытаетесь удалять то, что не выделяли.
Или просто используйте массив указателей, или, если выделяете память для хранения слов - копируйте слова в выделенную память.
Update Вариант 1:
int main() { ... char** data = (char**)malloc(sizeof(char*) * 25); for (int i = 0; i < 25; i++) data[i] = NULL;
int length = 0; for(char * с = strtok(string, " ");c;c = strtok(NULL, " ")) { data[length++] = c; } //Do Something
free(data); free(string); }
Вариант 2:
int main() { ... char** data = (char**)malloc(sizeof(char*) * 25); for (int i = 0; i < 25; i++) data[i] = (char*)malloc(sizeof(char) * 20);
int length = 0; for(char * с = strtok(string, " ");c;c = strtok(NULL, " ")) { strcpy(data[length++],c); } //Do Something
for (int i = 0; i < 25; i++) { free(data[i]); } free(data); free(string); }
Я бы все же добавил проверки на количество слов и длину... Мало ли кто что обещает...

Как показывать только 3 строки по умолчанию, а всю таблицу только при нажатии кнопки “показать всю”

Есть рейтинг на сайте

Фамилия Имя Очки
1 Мацюк Александр 280
2 Мурзин Максим 135
3 Тюков Владимир 85
4 Гаврилов Константин 80
5 Кутя Сергей 80
6 Кислань Елизавета 72
7 Моисеенко Александр 61
8 Краснов Денис 60
9 Кислань Сергей 59
10 Кулага Илья 59

Как сделать, что бы показывало на странице только ТОП3 и при нажатии на кнопку(ее пока нет) "показать весь рейтинг" открывало весь рейтинг.


Ответ

Например вот так:
var button = document.getElementById('showAll'); table = document.getElementById('myTable'); button.addEventListener('click', function() { // Проверяем на наличие класса и вызываем соответсвуюущую функцию table.classList.contains('opened') ? hideRows() : showRows(); }); function showRows() { table.classList.add('opened'); button.innerHTML = 'Скрыть'; } function hideRows() { table.classList.remove('opened'); button.innerHTML = 'Показать всё'; } .tablesorter tbody tr { display: none; } .tablesorter.opened tbody tr { display: table-row; } .tablesorter tbody tr:nth-child(1), .tablesorter tbody tr:nth-child(2), .tablesorter tbody tr:nth-child(3) { display: table-row; }

Фамилия Имя Очки
1 Мацюк Александр 280
2 Мурзин Максим 135
3 Тюков Владимир 85
4 Гаврилов Константин 80
5 Кутя Сергей 80
6 Кислань Елизавета 72
7 Моисеенко Александр 61
8 Краснов Денис 60
9 Кислань Сергей 59
10 Кулага Илья 59

Вычисление кубического корня в sympy

Код:
a = simplify('x**(1/3)') print(a.subs(x, -10).evalf())
Вывод:
1.07721734501594 + 1.86579517236206*I
Почему он с мнимой единицей? Есть же корень кубический из отрицательного числа? Или я что-то забыл? В чём причина?


Ответ

Эта проблема берётся от того, что и стандартно в python, если попытаться вычислить выражение (-10)**(1/3), то получим, как раз то, что у вас и получается. (Так как вычисляется 1/3 приближенно, а для числа 0.333333 никакого истинного корня нет. В документации к cbrt в sympy также явно указано, какой ответ она считает истинным и какой выдаёт, предупреждая что для отрицательных чисел он может отличаться от того, что вы ожидали.
Но вместо возведение в степень (1/3) можно использовать функцию real_root() она как раз делает то, что вам нужно:
>>> a = simplify('real_root(x, 3)') ... print(a.subs(x, -10).evalf())
−2.15443469003188
более того метод root может возвращать и другие корни. В качестве третьего параметра он берёт номер корня, который следует вернуть:
>>>root(-10, 3, 0).evalf() 1.07721734501594+1.86579517236206i >>>root(-10, 3, 1).evalf() −2.15443469003188 >>>root(-10, 3, 2).evalf() 1.07721734501594−1.86579517236206i

UHF RFID. Телефоны

Прочел в интернете, а причем тут, что на телефонах с ОС Андроид(2.3 или выше) поддерживается сканирование RFID меток. Является ли это истиной ? :D. Спрошу вот так: Есть телефоны в которых есть RFID считыватель.


Ответ

В статье по вашей ссылке речь идет о конкретных моделях внешних считывателей RFID-меток, которые взаимодействуют со смартфоном через Bluetooth и Wi-Fi.
*Bluetooth and Wi-Fi. BLE support for idChamp RS3, Scanfob® NFC-BB2-BLE and more (Android 4.3+ needed for BLE support)
Однако, телефон оснащенный NFC-модулем может считывать некоторые RFID-метки диапазона HF (13.56 МГц, стандарт ISO 14443).
UHF RFID метки работают на совершенно других частотах (860—960 МГц). Их вам считать НЕ удастся.

Как записать правильно вот такой селектор JavaScript [не jQuery]

Хотелось бы записать вот такой селектор:
document.querySelectorAll(".smallinnertable:not(:has(a))");
На jQuery работает, а на чистом JS нет. Такой селектор очень нужен. Спасибо за помощь.


Ответ

Вряд ли что-то есть прям в точности легкое и простое. Ведь даже на Jquery написан хорошенький и хитрый фильтр для селекторов.
Поэтому, как вариант, написать что-то самому. Например что-то подобное:
function getElementHasNotAnother(selector, filterEl) { var divs = document.querySelectorAll(selector), filter = Array.prototype.filter; return filter.call( divs, function( node ) { return node.querySelectorAll(filterEl).length == 0; }); } var result = getElementHasNotAnother('.smallinnertable', 'a'); /*********** check *************************/ for (var el in result) { console.log(result[el].textContent); }

1231
werjhwer
879879
4 34

оптимизировать вычисления

при реализации этой задачи столкнулся с проблемой медленных вычислений
Сперва решил ускорить log10 - не помогло, хоть и вычисляет быстрее чем log10 из стандартной библиотеки - (см. сравнение в коцне вопроса), но использование таблицы степеней 10 оказалось не сильно хорошей идей, хотя бин поиск должен был повлиять...
Вобщем, не могу понять что ещё и главное как можно оптимизировать кроме вычисления десятичного логарифма
#include #include #include #include
const long double _10_POWERS[40] = { 1e+0, 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39 };
static inline uint32_t log10_fast(long double x) { //uint32_t res = 0; int l = 0, r = 40 - 1;
while (l <= r) { int mid = l + ((r -l) >> 1);
if ( x >= _10_POWERS[mid] && x < _10_POWERS[mid + 1] ) { return mid; }
if (x >= _10_POWERS[mid]) l = mid; else r = mid; }
return 0; };
uint32_t compute(int n, std::vector>& a) { long double x = 0.0f; uint32_t s = 0;
const long double _2_96 = pow(2, 96); const long double _2_64 = pow(2, 64); const long double _2_32 = pow(2, 32);
for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { x = _2_96 * (a[i][0] ^ a[j][0]); x += _2_64 * (a[i][1] ^ a[j][1]); x += _2_32 * (a[i][2] ^ a[j][2]); x += (a[i][3] ^ a[j][3]);
s += log10_fast(x); } }
return 2 * s; }
int main(int argc, char const *argv[]) { int n; std::cin >> n; std::vector> a(n, std::vector(4));
for (int i = 0; i < n; ++i) { for (int j = 0; j < 4; ++j) { std::cin >> a[i][j]; } } std::cout << compute(n, a) << '
'; return 0; }
Какие есть идеи по поводу оптимизаций тут ?
Может есть другой более быстрый способ вычислить log10 ? Или может дело не в логарифме ?
p.s.
сравнение log10 и log10_fast
uint32_t s = 0; high_resolution_clock::time_point t1 = high_resolution_clock::now();
for (unsigned i = 0; i < 1e+8; ++i) { s += log10( static_cast(rand()) ); } high_resolution_clock::time_point t2 = high_resolution_clock::now(); duration dur = duration_cast( t2 - t1 ); std::cout << dur.count() << '
'; // 6.374 sec
s = 0; t1 = high_resolution_clock::now(); for (unsigned i = 0; i < 1e+8; ++i) { s += log10_fast( static_cast(rand()) ); } t2 = high_resolution_clock::now(); dur = duration_cast( t2 - t1 ); std::cout << dur.count() << '
'; // 5.907 sec


Ответ

Мне кажется, что главная проблема заключается в том, что вы много раз вызываете функцию log10. Давайте распишем сумму логарифмов как логарифм произведения:

Если чисел немного, так что их произведение не вызовет переполнение, то можно так и посчитать.
Другая проблема заключается в использовании дробных чисел, они не так быстро перемножаются, как целые. Хочу предложить приближённое решение в целых числах. Заметим, что если, например, a[i][1] xor a[j][1] не равно нулю, то a[i][3] xor a[j][3] и a[i][4] xor a[j][4] можно не считать, так как их добавка к xor'у будет очень маленькой. Рассмотрим следующий алгоритм:
Для каждой пары (i, j), приближённо считаем A_i xor A_j в виде x * 2^k, где x, k --- некоторые целые числа, причём 0 <= x < 2^32 Перемножаем полученные значения следующим образом: (x1 * 2^k1) * (x2 * 2^k2) = (x1 * x2) * 2^(k1+k2) = x * 2^(k1+k2), причём 0 <= x <= 2^64. Представляем x в виде x=y * 2^m', причём 0 <= y < 2^32. Итак, (x1 * 2^k1) * (x2 * 2^k2) = y * 2^(k1+k2+m) По факту мы посчитали не десятичный логарифм, а двоичный, чтобы получить десятичный логарифм, нужно домножить на log_10(2).
Собственно, код:
#include #include #include #include #include "/home/dima/C++/debug.h" using namespace std;
double compute(const vector &a) { static const uint64_t two_power_32 = 1ull << 32; int n = a.size();
// текущий накопленный результат равен value * 2^power_index uint64_t value = 1; int power_index = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < i; ++j) { uint64_t xor1 = a[i][0] ^a[j][0]; uint64_t xor2 = a[i][1] ^a[j][1];
uint64_t value_current; if (xor1 == 0) { value_current = xor2; } else if (xor1 >= two_power_32) { value_current = xor1; power_index += 64; } else { assert(0 <= xor1 && xor1 < two_power_32); value_current = (xor1 << 32) + (xor2 >> 32); power_index += 32; } while (value_current >= two_power_32) { value_current /= 2; ++power_index; } assert(0 <= value_current && value_current < two_power_32); assert(0 <= value && value < two_power_32); value *= value_current; while (value >= two_power_32) { value /= 2; ++power_index; } } }
// result = log10(value * 2^power_index) // result = log10(value) + log10(2^power_index) // result = log10(value) + power_index * log10(2) double result = log10(value) + power_index * log10(2); return result * 2; }
int main() { freopen("input.txt", "r", stdin);
int n; cin >> n; vector a(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < 2; ++j) { uint32_t ai1, ai2; cin >> ai1 >> ai2; a[i][j] = (uint64_t(ai1) << 32) + ai2; } } cout << compute(a) << endl; return 0; }
К сожалению, я не сравнивал производительность, но я искренне верю, что это работает быстрее, чем n^2 раз вычислять log10
Обновление: я тут потестировал, при n=5000 моя реализация чуть медленнее вашей оригинальной. Всё дело в этих циклах:
while (value >= two_power_32) { value /= 2; ++power_index; }
Их можно переписать разными способами, вот вариант для GCC:
static const uint64_t two_power_32 = 1ull << 32;
inline void divide_until_less_then_two_power_32(uint64_t &value, int &power_index) { // Эта функция эквивалентна этим строчкам: // while (value >= two_power_32) { // value /= 2; // ++power_index; // }
if (value < two_power_32) { return; } int power_index_delta = 32 - __builtin_clzll(value); power_index += power_index_delta; value >>= power_index_delta; assert(0 <= value && value < two_power_32); }
Полный код:
#include #include #include #include using namespace std; #include "/home/dima/C++/debug.h"
static const uint64_t two_power_32 = 1ull << 32;
inline void divide_until_less_then_two_power_32(uint64_t &value, int &power_index) { // Эта функция эквивалентна этим строчкам: // while (value >= two_power_32) { // value /= 2; // ++power_index; // }
if (value < two_power_32) { return; } int power_index_delta = 32 - __builtin_clzll(value); power_index += power_index_delta; value >>= power_index_delta; assert(0 <= value && value < two_power_32); }
double compute(const vector &a) { int n = a.size();
// текущий накопленный результат равен value * 2^power_index uint64_t value = 1; int power_index = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < i; ++j) { uint64_t xor1 = a[i][0] ^a[j][0]; uint64_t xor2 = a[i][1] ^a[j][1];
uint64_t value_current; if (xor1 == 0) { value_current = xor2; } else if (xor1 >= two_power_32) { value_current = xor1; power_index += 64; } else { assert(0 <= xor1 && xor1 < two_power_32); value_current = (xor1 << 32) + (xor2 >> 32); power_index += 32; } divide_until_less_then_two_power_32(value_current, power_index); assert(0 <= value_current && value_current < two_power_32); assert(0 <= value && value < two_power_32); value *= value_current; divide_until_less_then_two_power_32(value, power_index); } }
// result = log10(value * 2^power_index) // result = log10(value) + log10(2^power_index) // result = log10(value) + power_index * log10(2) double result = log10(value) + power_index * log10(2); return result * 2; }
int main() { freopen("input.txt", "r", stdin);
int n; cin >> n; vector a(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < 2; ++j) { uint32_t ai1, ai2; cin >> ai1 >> ai2; a[i][j] = (uint64_t(ai1) << 32) + ai2; } } cout << compute(a) << endl; return 0; }
Если я всё правильно посчитал, то эта версия работает в два раза быстрее.
Обновление 2: исправил ошибку (добавил строчку power_index += 32;)

можно ли переиспользовать сокет

здравствуйте, вот, допустим, есть у меня клиентский сокет... сделали connect, приняли данные/отправили... а можно ли приконнектится к другому адресу, и так же, как ни в чем ни бывало, начать обмен с другим совершенно хостом? я так понимаю, параметр SO_REUSEADDR на это не влияет


Ответ

Именно, опция SO_REUSEADDR используется только для бинда портов и к исходящим подключениям отношения не имеет.

При первом клике блоки должны появляться, при следующем пропадать

Glad to see you there!
What is your name?
What do you like?
Tell me :)

JQuery подключен. Прошу помощи )
$( window ).load(function() { document.$('.container').click(function() { var boxes = $('.boxes'); if(boxes.hasClass('showed')){ boxes.style.display = 'none'; boxes.removeClass('showed'); } else { boxes.style.display = 'flex'; boxes.addClass('showed'); } }); });


Ответ

может так:
$(document).on('click', '.container', function() { var boxes = $('.boxes'); var state = $(this).data('state'); state = !state; if (state) boxes.addClass('showed'); else boxes.removeClass('showed'); $(this).data('state', state); }); .boxes { display: none; } .showed { color: red; display: flex; }

click
Glad to see you there!
What is your name?
What do you like?
Tell me :)

Манипуляция только классами. Ну и дополнительная data-state, чтоб знать текущее состояние элементов

Сравнение DateTime через LINQ

Стыдно, знаю. Не нагуглил. Как вывести всех людей, у которых ДР меньше чем в переменной defaultDateTimes? Через LINQ
public class Person1 { public string Name; public DateTime Birthday; }
class Program { static void Main(string[] args) { DateTime defaultDateTimes = new DateTime(2000,1,1);
var people = new List(); var p1 = new Person1() { Name = "Leslie", Birthday = new DateTime(1983, 9, 4) }; var p2 = new Person1() { Name = "Chris", Birthday = new DateTime(2001, 6, 19) }; var p3 = new Person1() { Name = "JP", Birthday = new DateTime(1983, 4, 5) }; } }


Ответ

Например, так:
DateTime defaultDateTimes = new DateTime(2000, 1, 1);
var people = new List() { new Person1() { Name = "Leslie", Birthday = new DateTime(1983, 9, 4) }, new Person1() { Name = "Chris", Birthday = new DateTime(2001, 6, 19) }, new Person1() { Name = "JP", Birthday = new DateTime(1983, 4, 5) } };
var filteredPeople = people.Where(p => p.Birthday < defaultDateTimes); foreach (var p in filteredPeople) Console.WriteLine(p.Name);

LINQ предназначено для преобразования данных. Оно умеет, например, отбирать данные из списка (как в вашем случае людей) и преобразовывать их. Выполнять действия с данными (например, вывести имя человека) LINQ не умеет (да и не предназначено для этого).
Поэтому в вашей задаче фильтрация данных — дело LINQ, а для вывода нужно использовать обыкновенный цикл foreach

PHP, Что за конструкция “$a=(array) $b” обозначает

недано начал изучать Php, в скрипте встретил такую конструкцию
$a=(array) $b
не могу понять что она делает, объясните пожалуйста на пальцах.


Ответ

Это приведение к типу, а именно приведение к типу array переменной $b. Такое может использоваться например в том случае, когда переменная $b содержит данные типа stdClass

Правильная скобочная последовательность стек python [дубликат]

На данный вопрос уже ответили: Проверить правильно ли вложены скобки 〈 ( { [ ] } ) 〉в тексте 2 ответа Всем привет, кто может помочь с реализацией проверки на правильность скобочной последовательности через стек на Python. Суть проверки я знаю, и просто через условия реализовала, но со стеком не могу понять, помогите пожалуйста.
def brackets_check(s): meetings = 0 for c in s: if c == '(': meetings += 1 elif c == ')': meetings -= 1 if meetings < 0: return False
return meetings == 0


Ответ

А мне понравился этот простой и хитрый алгоритм -- главное чтобы строка в нем не имела символом, кроме ()[]{}, там даже объяснять ничего не нужно:
def is_correct_brackets(text): while '()' in text or '[]' in text or '{}' in text: text = text.replace('()', '') text = text.replace('[]', '') text = text.replace('{}', '')
# Возвращаем True, если text с пустой строкой return not text
print(is_correct_brackets('(((())))')) # True print(is_correct_brackets('(((())')) # False print(is_correct_brackets('())))')) # False print(is_correct_brackets('((((){}[]{}[])))')) # True print(is_correct_brackets('(){}[]{}[])))')) # False print(is_correct_brackets('(){}[]{}[]')) # True

JavaScript - найти ключ зная его значение

Надо найти в объекте ключ, зная только его значение. Я написал код, но он не находит ключи находящиеся в под-объекте. Вот сам код:
Object.prototype.getKeyByValue = function(value) { for(var prop in this) { if(this.hasOwnProperty(prop)) { if(this[prop] === value) return prop; } } }
Первый пример (работает корректно):
Object.prototype.getKeyByValue = function(value) { for (var prop in this) { if (this.hasOwnProperty(prop)) { if (this[prop] === value) return prop; } } } var foobar = { foo: 4, bar: 7 } document.write(foobar.getKeyByValue(7));
Второй пример (работает не корректно):
Object.prototype.getKeyByValue = function(value) { for (var prop in this) { if (this.hasOwnProperty(prop)) { if (this[prop] === value) return prop; } } } var foobar = { foo: 4, bar: { baz: 7 } } document.write(foobar.getKeyByValue(7));
Почему во втором примере не находит значение и как это исправить?


Ответ

Потому что для поиска вглубь нужна рекурсия.
Object.prototype.getKeyByValue = function(value, objs) { // защита от циклических ссылок if (!objs) objs = []; for (var prop in this) { if (this.hasOwnProperty(prop)) { if (this[prop] === value) { return prop; } else if (typeof this[prop] === "object" && objs.indexOf(this[prop]) == -1) { objs.push(this[prop]); var res = this[prop].getKeyByValue(value, objs); if (res) return prop + "." + res; //за дополнительные баллы оценки - выведем цепочку названий ключей } } } } var foobar = { foo: 4, bar: { baz: 7 } } console.log(foobar.getKeyByValue(7));

Вывод информации о процессе

Допустим есть процесс firefox(pid 5059) Как вывести с помощью ps владельца этого процесса, аргументы с которыми был запущен этот процесс, группу владельца этого процесса и т.д.
ps -eo user, ? , ? | grep firefox


Ответ

владельца этого процесса, аргументы с которыми был запущен этот процесс, группу владельца этого процесса
для процесса номер 5059
$ ps -o user,args,group -p 5059
для процессов, выполняющих файл с именем firefox
$ ps -o user,args,group -C firefox
и т.д.
см. секцию STANDARD FORMAT SPECIFIERS в man ps

Как заранее подгрузить бэкграунды?

Есть код:
function changingBg(delay = 3000) { let changingBgBlock = document.querySelector('.section-block_bg-change'); let i = 0; let backgrounds = [ "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-2.jpg') no-repeat; background-size: cover; background-position: 50% 0;", "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-1.jpg') no-repeat; background-size: cover; background-position: 50% 0;", "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-4.jpg') no-repeat; background-size: cover; background-position: 50% 0;", "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688477/Chahning-bg/bg-3.jpg') no-repeat; background-size: cover; background-position: 50% 0;" ]; setInterval(function() { if (i == backgrounds.length - 1) { i = 0; } console.log(backgrounds[i]); changingBgBlock.style.cssText = backgrounds[i]; i++; }, delay) } changingBg(); html, body { width: 100%; height: 100%; min-height: 100%; } .section-block_bg-change { -webkit-transition-duration: 1s; transition-duration: 1s; width: 100%; min-height: 100%; }


https://codepen.io/dima_bur/pen/mwQrNX
Фон у блока должен меняться плавно, но это происходит только после прохождения первого цикла, когда все изображения уже подгрузятся. Подскажите, как сделать так, чтобы изображения менялись плавно с самого начала?


Ответ

Попробуйте заранее прогрузить Ваши изображения на JS (выполните этот код в начале страницы):
new Image().src = 'http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-2.jpg'; new Image().src = 'http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-1.jpg'; new Image().src = 'http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-4.jpg'; new Image().src = 'http://res.cloudinary.com/dk0qq/image/upload/v1499688477/Chahning-bg/bg-3.jpg';

получить значение тега JS

Привет.
Как ни странно, но не получается получить значение тега
var getNum = document.getElementById('get_num').value; var addTime = document.getElementById('add'); addTime.addEventListener('click', getN); function getN() { console.log(getNum); }

Write time:
Add

Заранее спасибо!


Ответ

Потому что получать значение нужно непосредственно в обработчике.
Сейчас же ты выводишь то, что было сохранено при загрузке страницы.
var addTime = document.getElementById('add'); addTime.addEventListener('click', getN); function getN() { var getNum = document.getElementById('get_num').value; console.log(getNum); }

Write time:
Add

Удаление drawable-ресурсов

Когда происходит удаление drawable-ресурсов (when packaging an APK - при сборке APK или при установке APK на конкретное устройство?) и почему mipmap-ресурсы при этом не удаляются?
while drawable resources might be removed when packaging an APK, such as for the Gradle for Android split system for making density-specific editions of an app, mipmap resources are left alone, apparently
P.S. И что значит "Android split system"?


Ответ

Когда происходит удаление drawable-ресурсов (when packaging an APK - при сборке APK или при установке APK на конкретное устройство?)
Удаление ресурсов происходит на этапе сборки проекта (ведь цель этого – уменьшить размер APK). Исключить ресурсы можно с помощью оператора exclude, например:
exclude "ldpi", "xxhdpi", "xxxhdpi"
и почему mipmap-ресурсы при этом не удаляются?
В этом и есть вся фишка mipmap-ресурсов. Далее процитирую свой ответ
Зачем нужен mipmap? Для корректного отображения изображений на дисплеях с различными DPI в Android были введены квалификаторы (например, mdpi, hdpi). Чтобы изображения корректно выглядели на всех устройствах, необходимо разместить эти изображения со всеми доступными квалификаторами (в соответствующих разрешениях). Размещение изображений в различных разрешениях влечет за собой увеличение размера приложения. Допустим, Вы знаете, что у Боба такое-то значение DPI, а у Алисы – некоторое другое. Чтобы уменьшить размер приложения, Вы можете отдельно собрать приложение для Боба и отдельно для Алисы, включая изображения только в необходимом разрешении. При сборке проекта Вы можете исключить ненужные изображения (с помощью соответствующей конфигурации Gradle), например:
exclude "ldpi", "xxhdpi", "xxxhdpi" Вроде бы все хорошо: исключены ненужные изображения и размер приложения уменьшен. Однако не все так гладко. Некоторые изображения могут быть отображены в разрешениях, которые не соответствуют тому, в котором Вы оставили эти изображения в проекте. Пример – иконка приложения, в некоторых лаунчерах она может быть увеличена. Так как иконка приложения у Вас в единственном разрешении (как и все другие изображения), то она будет увеличена и произойдет т.н. пикселизация – изображение будут размыто (при большом апскейле будут заметны квадратики). Вот тут-то и приходит на помощь mipmap – изображения, размещенные там, не будут исключены. То есть если Вы укажите в Gradle:
exclude "ldpi", "xxhdpi", "xxxhdpi" то соответствующие изображения из drawable будут исключены, а из mipmap – нет.

Android split system – условное название совокупности конструкций, которые используется для разделения ресурсов для APK.

Синхронизация потоков при наращивании count += 1 глобальной переменной

Версия Python 3.5, использую модуль threading. Нужна ли синхронизация, когда потоки изменяют общую глобальную переменную в один момент времени? В книгах пишут, что нужно использовать Lock(), но и без него не возникает не каких проблем. Пример кода из книги:
import threading, time
count = 0
def adder(): global count count += 1 time.sleep(0.5) count += 1
threads = [] for i in range(100): thread = threading.Thread(target=adder, args=()) thread.start() threads.append(thread)
for thread in threads: thread.join()
print(count)
Вот здесь, судя по книге, должно каждый раз выдавать разные числа, так как одновременно 100 потоков в один момент времени меняют переменную count. Но почему-то всё нормально срабатывает. Это в какой-то версии было исправлено или как? Объясните, кто знает.


Ответ

Атомарные операции.
Переключение нитей происходит только между отдельными байт-код операциями. Сами же операции неделимы. Посмотреть, как выглядит байт-код можно с помощью модуля dis
Вот некоторые потокобезопасные операции:
чтение или изменение одного атрибута объекта чтение или изменение одной глобальной переменной выборка элемента из списка модификация списка "на месте" (т.е. с помощью метода append) выборка элемента из словаря модификация словаря "на месте" (т.е. добавление элемента, или вызов метода clear)

Как передать “text” в C используя Makefile

Есть фаил BoardConfig.mk В нем есть команда
TARGET_BOARD_PLATFORM := mt6572
Мы берём это значение в Android.mk так
init_options += -Dold_kernel=$(TARGET_BOARD_PLATFORM)
и передаем его в init.cpp
{ "ro.boot.hardware", "ro.hardware", old_kernel, },
В итоге мы имеем:
{ "ro.boot.hardware", "ro.hardware", mt6572, },
Как сделать так, что бы передаваемое значение заключалась в "" ? То есть что бы получалась такая строка:
{ "ro.boot.hardware", "ro.hardware", "mt6572", },


Ответ

Надо просто в Android.mk изменить строку на:
init_options += -Dold_kernel=\"$(TARGET_BOARD_PLATFORM)\"

Посимвольный вывод слов

Здравствуйте!
Есть такая конструкция, которая выведет первую букву переменной $str, которая будет равна 't'
mb_internal_encoding("UTF-8"); $str = 'test'; print_r($str[0]); // выведет 't'
Но почему это не работает с русскими словами?
mb_internal_encoding("UTF-8"); $str = 'тест'; print_r($str[0]); // выведет '�', вместо 'т'
Кодировка вроде выставлена, но почему в выводе знак вопроса?
Подскажите, пожалуйста, как решить?
Спасибо!


Ответ

Всё дело в том, что в кодировке UTF-8 единичный символ может занимать разное количество байт (от 1 до 6 или даже больше).
Английские буквы, цифры, некоторые знаки препинания занимают по одному байту, и их представление ничем не отличается, как если бы они были закодированы в ASCII. Для букв русского алфавита, букв европейских языков, которых нет английском (например, немецкая Ö), для арабского алфавита, нужно уже по два байта. Распространённые восточные иероглифы занимают уже по 3 байта каждый. А всеми любимые эмодзи кодируются последовательностями от 4 байтов.
Итак, давайте рассмотрим байтовое представление ваших строк.
test -> 74 65 73 74 тест -> D1 82 D0 B5 D1 81 D1 82
Слева показано то, как эти буквы видим мы, справа — их побайтовое представление в памяти компьютера, причём значения байтов записаны в 16-ричной системе счисления (чтобы не занять много места). Как видите, русское слово занимает в два раза больше памяти, хотя букв в нём столько же. Кроме того, обратите внимание, каждый байт в его кодированном варианте не меньше 8016
Теперь вернёмся к PHP. Строки в этом языке о кодировках ничего не знают, а просто хранят в себе только байты. И оператор индексирования тоже ничего про кодировки, буквы, символы не знает; он просто, будучи применённым к строке, возвращает байт с указанным номером. Поэтому, когда вы пытаетесь напечатать первый байт (с номером 0), в первом случае выводится байт со значением 7416, который на экране компьютера виден как маленькая латинская буква «t». А во втором случае на вывод подаётся байт со значением D116, представляющий собой огрызок русской буквы «т»; не зная, какой байт идёт дальше, устройство вывода (терминал или веб-обозреватель) просто рисует знак вопроса.
Что же делать, как напечатать только первый символ из строки? В качестве решения можно применить функции из расширения php-mbstring
$letter = mb_substr($str, 0, 1); // вернёт первый code point из строки
Но учтите, функция mb_substr оперирует понятием code point, а не graphical cluster. Какое же это имеет значение? Стандарт юникода позволяет составлять некоторые буквы из нескольких code points. К примеру, буква «ё» может оказаться комбинацией буквы «е» и умляута.