Страницы

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

пятница, 11 января 2019 г.

XSLT разница между элементом xsl:text и текстом

Для чего или в каких случаях нухно использовать элемент в XSLT?
вот пример кода

  • / /
    ISBN:

попробовал написать без элемента , результат тот же.
  • / /
    ISBN:

  • в чем же сила этого элемента?


    Ответ

    Используя xsl:text можно точно управлять выводом пробельных символов.
    Под ваш код xsl я взял такой xml:
    Title1 Autor1 ver1.0 Title2 Autor2 ver2.0
    Первый вариант вашего кода, с xsl:text даёт такой вывод:

    test

    • Title1 / Autor1 / ver1.0
      ISBN:1
    • Title2 / Autor2 / ver2.0
      ISBN:2

    Второй вариант выдаёт следующее:

    test

    • Title1 / Autor1 / ver1.0
      ISBN: 1
    • Title2 / Autor2 / ver2.0
      ISBN: 2

    Как можно видеть, во втором случае значение ISBN: было скопировано вместе с пробелами перед ним, а также с переводами строки.

    Чтобы не было недопонимания, приведу полный текст xsl-преобразования, который я использовал:

    • / /
      ISBN:

    Размер списка в Python и объём оперативной памяти

    При исполнении следующего кода
    n = 10 ** 9 alist = [0] * n
    Компьютер начинает работать очень медленно (похоже из-за нехватки оперативной памяти?). Если я правильно понял, в этом случае список создаётся и вмещается в память, но занимает такое её количество, что всё начинает "тормозить". При этом, например, если размер списка равен 10 ** 10, то сразу выдаётся MemoryError. Получается, что пайтон не может вместить список такого размера в оперативную память (её физически не хватает) или стоят какие-то ограничения на размер списка?
    Хотелось бы разобраться, почему так происходит в этих двух случаях. Также хотел узнать, как лучше защититься от зависаний вследствие нехватки оперативной памяти (каждый раз заранее прикидывать, какой объём памяти будет занимать список, написать какой-нибудь код, где будет проверяться это дело или ещё как-то?).
    Обновление
    Списки такого размера мне понадобились при нахождении всех простых чисел меньше n с помощью решета Эратосфена. Я начал с n = 100 и постепенно увеличивал размер списка. Вплоть до 10 ** 8 всё работало, а потом начались неприятные тормоза. Соответственно, хотел узнать как можно защититься (от себя) в таких случаях. Может есть какие-нибудь рекомендации по максимальному размеру списка в процентах от объёма оперативной памяти, чтобы не возникало таких зависаний?


    Ответ

    [0] * n список в CPython требует примерно n * <размер указателя> байтов (можно посмотреть на реализации функций list_repeat(), PyList_New(n), PyMem_Malloc(), чтобы увидеть случаи когда MemoryError сразу выбрасывается без попытки выделения памяти -- на 32-битной платформе эти пределы достаточно низкие: n = 536870911 (((2**32 - 1) >> 1) // 4), на 64-битной платформе маловероятно что эти условия сработают -- другими словами: вы можете создавать списки настолько большими насколько у вас памяти хватит -- практически ограничений нет.
    Защита простая: узнайте сколько у вас на компьютере памяти и не пытайтесь выделить больше этого кол-ва.
    По конкретной задаче: можно уменьшить потребление памяти в 4-8 раз, если использовать array, numpy.array вместо списка. Можно ещё снизить, если предварительно исключить маленькие простые числа (wheel-optimizations), cм. Fastest way to list all primes below N. Можно ещё gmpy2 использовать (до 16 раз меньше памяти), см. Speed up bitstring/bit operations in Python?
    Для n более 10**9 может иметь смысл использовать решето Аткина, которое требует N1/2+o(1) бит памяти, вместо решета Эратосфена O(N1/2(log log N)/log N))
    Существуют алгоритмы без верхней границы, если не известно заранее сколько простых чисел надо.
    Если нужны бо́ льшие числа, то можно использовать алгоритмы, которые работают посегментно (позволяют как верхную так и нижнюю границу указать), например, pyprimesieve

    Как убить неубиваемый процесс в Windows 7?

    Как убить неубиваемый процесс? "Завершить процесс в ДЗ" - не идет; стороннее ПО AnvirTaskManager - не помогает, командная строка через "taskkill /IM *.exe /F" также не спасает. Ума не приложу ОС Win7


    Ответ

    Если отбросить автоматически перезапускающиеся процессы, то да, действительно, в Windows иногда встречаются "неубиваемые" процессы. Он делятся на две группы. К первой относятся защищённые процессы, например, процессы антивируса, для "убийства" которых у пользователя не хватит прав и "зависшие", которые по каким-то причинам система "убить" не может. В моей практике встречались процессы из второй группы. Один раз так у меня завис отладчик GDB
    Для снятия таких зависших неубиваемых процессов можно использовать, например, Process Explorer Марка Руссиновича. Позволяет снять почти любой процесс. Но иногда не помогает. Тогда можно попробовать программу Process Hacker. В её арсенале целый набор методов для снятия процессов. Если не справился Process Explorer, часто помогает Process Hacker. Правой кнопкой мыши на требуемом процессе -> Miscellaneous -> Terminator. Также, если завис процесс какой-либо IDE в момент отладки, может помочь правой по отлаживаемому процессу Miscellaneous -> Detach from Debugger.
    Однако, иногда встречается такая гадость, что её невозможно снять никаким методом. Почему это происходит, мне неизвестно. Но пару раз встречалось. И не всегда при этом машина способна нормально уйти в перезагрузку, иной раз этот зависший процесс не даёт этого сделать. И тогда помогает только кнопка Reset.

    Почему BitSet реализован на массиве long

    Нигде, почему-то, в интернете не объясняется выбор long в качестве хранилица BitSet. Например, почему нельзя использова вместо него short. Пусть мы заполняем структуру N ( N< 64 ) элементами, тогда получится, что в сравнении с short , оверхед по памяти будет больше.


    Ответ

    Не представляю что такое Bitset и с java не знаком. Но если делать какой то базовый класс для работы с битами и не делать его с меняемым размером элементов хранения я бы остановился на выборе максимального по размеру типа влезающего в регистр процессора для данной архитектуры. С точки зрения процессора операция с short и long занимает одинаковое время выполнения. Кроме того, операция с данными в оперативной памяти не выравненными на ширину шины данных обычно происходит дольше. В связи с этим данные стараются выравнивать на ширину шины. Попытки выровнять short приведет к образованию неиспользуемого пространства, что сведет экономию памяти к 0
    На современной архитектуре intel используется 64 разрядные регистры и необходимо такое же выравнивание данных в памяти, для быстрой работы

    Как назначить IP-адреса в сети?

    Провайдер выдал для сети диапазон адресов 195.223.251.160/29. Адрес шлюза, выданный провайдером, 195.223.251.161. Мне нужно назначить IP-адреса следующим устройствам: компьютер, сервер, 3 IP-камеры, IP-телефон.
    Я рассуждал следующим образом: исходя из маски, мне доступны адреса от 195.223.251.161 до 195.223.251.167. При этом 195.223.251.167 - широковещательный, и его использовать нельзя, а 195.223.251.161 занят под шлюз.
    Следовательно, реально я могу использовать только адреса от 195.223.251.162 и до 195.223.251.166. То есть мне доступно всего 5 адресов, а IP-адреса нужно назначить 6 устройствам.
    Верно ли я рассуждаю по поводу определения доступных IP-адресов? Действительно ли не удастся назначить IP-адреса всем 6 устройствам?


    Ответ

    Ну компьютер можно и за сервер убрать, который для него маршрутизатором будет. Предлагаю просто попробовать задействовать 167 адрес, в интернете никто не будет считать его броадкастом. Разве что ваш провайдер ...
    Попробуйте поставить 167 ну скажем на компьютер, если ОС начнет орать что нибудь по поводу маски и т.п. просто расширьте ее до 28. В таком случае он не сможет увидеть реальники 195.223.251.168/29 потому как они попадут в маску и он будет считать, что они в его локалке. Но обычно это не страшно, потому как там наверняка другой клиент вашего прова, связь с которым вам не нужна. Если вдруг нужна - то это лечится прописыванием маршрутизации на эту подсеть через ваш 161 шлюз. Если выйти в интернет с него получится, то на остальные устройства то же можно поставить 28 маску, что они нормально с ним общались, не думая что он броадкаст
    В большинстве случаев такие конфигурации работают нормально, хотя конечно и считаются кривыми
    P.S. Кстати, 160 адрес то же ваш, хотя считается адресом сети, но и его то же можно попробовать использовать

    Зачем при оптимизации копировать, инкрементировать, и копировать обратно?

    Код ассемблера ниже, если включена оптимизация Maximize Speed:
    ; 30 : i = i + 1;
    mov eax, DWORD PTR tv329[ebp] mov ecx, DWORD PTR tv328[ebp] inc ebx inc eax add ecx, 4 mov DWORD PTR tv329[ebp], eax mov DWORD PTR tv328[ebp], ecx
    А этот код с оптимизацией Minimize Size
    ; 30 : i = i + 1;
    inc edx inc esi add edi, 4
    Операция в программе i = i + 1
    Вопрос, зачем при оптимизации по скорости нужно копировать из DWORD PTR tv329[ebp] в eax, инкрементировать, а копировать обратно? Это помогает в скорости? Но как.
    Обновление:
    Maximize Speed: https://ideone.com/8JKULj Minimize Size: https://ideone.com/zbnv8n
    Обновление 2: Оптимизация по скорости:
    ; 14 : do { ; 15 : i = g;
    mov ebx, ecx xor eax, eax lea ecx, DWORD PTR _arr$[ebp+ecx*4] mov DWORD PTR tv329[ebp], eax mov DWORD PTR tv328[ebp], ecx npad 1
    Оптимизация по размеру:
    ; 14 : do { ; 15 : i = g;
    lea edi, DWORD PTR _arr$[ebp] mov edx, eax xor esi, esi lea edi, DWORD PTR [edi+eax*4]
    Зачем в оптимизации по размеру в lea заносить один адрес, потом выполнять действия, не связанные с lea и с _arr$, а затем опять заносить в lea уже другой адрес?


    Ответ

    На вопрос в заглавии ответ - инкрементировать непосредственно в памяти процессор не умеет, поэтому надо вытащить значение в регистр, увеличить и положить в память обратно.
    Конкретно приведенный в тексте вопроса кусок разумеется работает дольше, чем если бы i была просто в регистре. Но если рассмотреть весь код целиком, то выясняется, что переменная i по факту в цикле практически не используется и что самое важное - она не используется для обращения к массивам по индексу.
    Зато в полном оптимизированном по скорости коде видно, что основные переменные по которым идут обращения к массиву - постоянно в регистрах, флажок bool c даже в регистре dl. В целом количество обращений к памяти в самой середине циклов (которые выполняются больше всего раз) меньше. Обращения к памяти для работы с флагом c так же отсутствуют.
    Сравните например if в 20 строке и c=falseв 21:
    mov edi, DWORD PTR _arr$[ebp+eax*4] mov eax, DWORD PTR _arr$[ebp+ecx*4] mov esi, DWORD PTR [ecx] mov DWORD PTR _tmp$1$[ebp], eax mov eax, DWORD PTR [ebx] cmp edi, esi cmp DWORD PTR _tmp$1$[ebp], eax jg SHORT $LN3@main jg SHORT $LN3@main
    ; 21: c=false xor dl, dl mov BYTE PTR _c$1$[ebp], 0
    При оптимизации по скорости загружаем данные из 2х ячеек памяти, сравниваем и переходим. При оптимизации по размеру два "лишних" обращения к памяти. Причем часть из них самого if не касается, это похоже нужно позже, просто оптимизатор решил нарисовать их здесь. И в отличии от куска кода который не понравился вам, данная строка находится в 3 по вложенности цикле и выполняется явно гораздо больше раз, чем пресловутое i++; А флажок c в первом случае вообще мгновенный, во втором это загрузка константы по адресу в памяти, один из самых медленных вариантов mov, а ведь его потом еще проверяют так же доставая из памяти ...
    Итого - при оптимизации по скорости самые важные переменные постоянно в регистрах, а под менее важную переменную i уже не хватило регистров, поэтому ее оставили в памяти и обращаются по мере необходимости.
    P.S. А вообще оптимизатор жутко умный. я даже немного не ожидал от него такого (выдержки из вашего кода):
    int n=10; ... n = n - 1; mov DWORD PTR _arr$[ebp+4], 9 " Он понял, что в память надо сразу занести 9, а не пытаться грузить 10 и вычитать" while (i <= n) cmp ebx, 9 " Он видит что n нигде не меняется и использует его как константу"
    g = (n + 1) / 2; mov ecx, 5 " Он знает что n константа (9), значит g=5, вычислять опять не надо"
    do { i = g; xor eax, eax do { ; В eax он будет далее в цикле вести j j = i - g; и поэтому перед циклом он просто делает ее 0 " Он понял, что на первой итерации i=g и не пытался вычислять j через i и g"
    if(arr[j+g]... mov esi, DWORD PTR [ecx] " Вот это вообще гениально: он помнит, что в начале j=0 а в ecx он заранее загрузил адрес массива + g*4 (4 это размер элемента массива int) И когда вы пишите arr[j+g] он просто лезет в память по регистру ecx"
    j = j - 1; dec eax ; В eax j - тут все ясно, вычли 1 sub ecx, 4 ; А это зачем ??? "Я все никак не мог понять, почему при вычитании 1 из j еще 4 вычитается из ecx Но ларчик просто открывался, в ecx у нас, как мы помним, адрес элемента массива arr с индексом [j+g], а т.к. j уменьшается, а g в обозримом будущем меняться не собирается, то мы просто вычитаем из адреса 4, т.е. размер одного элемента массива и таким образом нам в цикле вычислять arr+i+g вообще не надо, мы его всегда знаем"
    "В приведенном коде сравнения 2х оптимизаторов был if(arr[j]<=arr[j+g]) который в конечном счете был cmp esi,edi; Так вот, значения элементов массива в регистрах далее по тексту не пропадает:" tmp = arr[j]; arr[j] = arr[j+g]; mov DWORD PTR _arr$[ebp+eax*4], esi arr[j+g] = tmp; mov DWORD PTR [ecx], edi "Нашей переменной tmp вообще нет, оптимизатор посчитал, что она не нужна и просто занес уже имеющиеся в регистрах значения arr[j] и arr[j+g] в массив, а в варианте с оптимизацией по объему tmp была ... "
    Дополнение на основе дополнения в вопросе :)
    lea edi, DWORD PTR _arr$[ebp] mov edx, eax xor esi, esi lea edi, DWORD PTR [edi+eax*4]
    Почему он выбирает именно такой порядок инструкций сказать сложно, на размер это ни как не влияет, может влиять например на кеш данных у процессора, или на параллельность выполнения команд. И lea не в себя грузит адрес, а грузит его в указанный регистр, в данном случае edi. Первый lea грузит в edi адрес массива arr, а второй lea грузит адрес уже с использованием того edi, который подготовил первый lea. А конкретно он выполняет edi=edi+eax*4, ну т.е. второй lea эквивалентен четырем подряд add edi,eax, но разумеется быстрее и меньше в размере

    ООП наследование private конструктор родительского класса

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


    Ответ

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

    Выбор между enum и final class для хранения опций

    Разрабатываю приложение на Java 8, в котором мне необходимо использовать некие настройки. Настройки могут быть разными, объединяет их сейчас то, что есть некоторое представление настройки (сейчас это - элемент перечисления), и ключ и значение настройки. Настройки планируется добавлять в ArrayList
    Сейчас передо мной встал выбор - использовать ли перечисление, реализующее общий интерфейс, для хранения настроек, или же попробовать воспользоваться final class
    Конкретно Java я только начинаю всерьёз заниматься, поэтому вопрос может быть глуповат, но поиск в Сети на русском и английском языках не дал мне ясности.
    Привожу пример (абстрактный), как реализовано сейчас:
    public interface Option { public String getKey(); public String getValue(); }
    public enum Option1 implements Option { OPTION1_VALUE_1("one"), OPTION1_VALUE_2("two"); private final String key; private final String value; Option1(String val) { this.key = "key1"; this.value = val; } @Override public String getKey() { return this.key; } @Override public String getValue() { return this.value; } }
    public enum Option2 implements Option { OPTION2_VALUE_1("aaa"), OPTION2_VALUE_2("bbb"); private final String key; private final String value; Option2(String val) { this.key = "key2"; this.value = val; } @Override public String getKey() { return this.key; } @Override public String getValue() { return this.value; } }
    Затем я планирую использовать эти "опции" как-то так:
    List


    Ответ

    Первую реализацию можно заменить на более удачную. В Enum можно определять свои конструкторы и методы. Тогда нет необходимости создавать интерфейс и т.п.. Мне кажется это будет наиболее удачным вариантом решения.
    public enum Option { OPTION_1("key 1", "value 1"), OPTION_2("key 2", "value 2");
    private String key; private String value;
    Option(String key, String value) { this.key = key; this.value = value; }
    public String getKey() { return key; }
    public String getValue() { return value; } }
    UPDATE
    По поводу использования. Если необходимо пройтись по всем опциям, то есть стандартный метод values()
    for (Option op : Option.values()) { System.out.println(op.getKey() + " - " + op.getValue()); }
    Если необходимо оперировать только частью опций, то используйте EnumSet, который предоставляет компактную и быструю структуру данных за счет внутренней реализации в виде битового вектора.

    Как запретить повторение значений в таблице?

    Есть таблица:
    | ID | Login | Post | +----+-------+----------+ | 1 | Woddy | manager | | 2 | Simi | operator | | 3 | Woddy | agent |
    Надо ограничение, например чтобы у Woddy не было разных Post(должностей). Создал индекс, сделал уникальным поля Login и Post Как понимаю это можно реализовать через Constraints, тогда что писать в expressions Нужно чтобы Login не повторялся Скрипт индекса:
    ALTER TABLE Persons ADD CONSTRAINT uc_Person UNIQUE (Login ,Post)


    Ответ

    Созданный вами:
    CONSTRAINT uc_Person UNIQUE (Login, Post)
    делает пару (Login ,Post) уникальной, т.е. Woddy может быть manager, но такая запись может быть только одна, Woddy не может быть manager дважды, и ему не запрещено иметь другие Post.
    Соответственно, чтобы Login не повторялся должно быть:
    CONSTRAINT uc_Person UNIQUE (Login)

    Как можно получить IndexOutOfBoundException, если index меньше size?

    Разве это возможно? Объясните пожалуйста, когда такое возможно и почему? Даже не знаю, как показать какой-либо кусок кода. Во-первых, ситуация очень странная. Во-вторых, к ней меня привела длинная цепочка вызовов (классы сильно взаимосвязаны). Даже не могу предположить где может быть проблема. Скажу только, что я получаю исключение запуская сложную задачу в SwingWorker.
    UPD: Благодаря полученным ответам, я понял на какой метод следует обратить наиболее пристальное внимание:
    @Override protected Void doInBackground() throws Exception { solver = new MultidimensionalSolver(manager.getTask()); manager.getTask().setSolution(solver.getSolution().getSolution()); while (!solver.isSolutionFind() && flag) { solver.findSolution(); manager.getTask().setSolution( solver.getSolution().getSolution()); publish(); iter++; } return null; }
    Здесь класс MultidimensionalSolver работает с теми же данными, которые выводятся на экран в методе process(), вызываемом при вызове publish(). Получается поток в методе publish настолько обгоняет поток в методе doInBackground?


    Ответ

    Такое может запросто случиться, если доступ к вашему ArrayList идет из нескольких потоков, при этом отсутствует синхронизация. Судя по тому, что вы используете SwingWorker, именно это и происходит. Сценарий может быть такой:
    Первый поток пытается взять элемент с индексом 2. При этом в коллекции, допустим, всего 1 элемент. В методе rangeCheck код этого потока заходит внутрь условия:
    private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } Второй поток добавляет 2 элемента (теперь их становится 3). Первый поток выбрасывает исключение со странным сообщением, поскольку метод outOfBoundsMsg подхватил новое значение size
    Решение: синхронизировать доступ (и чтение, и запись) к коллекции с помощью локов, либо использовать потокобезопасный вариант коллекции.

    Ожидание завершения AsyncTask без блокировки основного UI потока

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


    Ответ

    Заведите себе флаг типа boolean, который ставьте поумолчанию в false, а в onPostExecute() AsyncTask ставльте его в true, и переопределите onBackPressed у Activity, чтобы пока флаг != true, ничего не делать.

    Уточнение пространства имён enum-а

    Почему для return type надо уточнить какой enum
    TestClass::ePower TestClass::GetPower()
    , а для входного параметра нет?
    void TestClass::SetPower( ePower _power )
    при написании реализации вне класса ?

    Весь hello world код:
    #include using namespace std;
    //////////////////////////////////////////////////////////////////////////
    enum class ePower { other, };
    //////////////////////////////////////////////////////////////////////////
    class TestClass { public: enum class ePower { on, off };
    private: ePower power;
    public: void SetPower( ePower _power ); ePower GetPower(); };
    ////////////////////////////////////////////////////////////////////
    void TestClass::SetPower( ePower _power ) { power = _power; }
    TestClass::ePower TestClass::GetPower() { return power; }
    int main() { TestClass a; a.SetPower( TestClass::ePower::on ); }


    Ответ

    В соответствии с правилами поиска неквалифицированных имен, в частности, имена, используемые вне декларатора функции-члена класса, как, например, используемые в описании возвращаемого значения, ищутся в той области, где определен класс.
    Имена, используемые в частности в деклараторе функции-члене класса, ищутся в области определения класса.
    Поиск неквалифицированных имен для вашего примера описан в параграфах №7 и №8 раздела 3.4.1 Unqualified name lookup стандарта C++.
    7 A name used in the definition of a class X outside of a member function body, default argument, exceptionspecification, brace-or-equal-initializer of a non-static data member, or nested class definition29 shall be declared in one of the following ways: — before its use in class X or be a member of a base class of X (10.2), or — if X is a nested class of class Y (9.7), before the definition of X in Y, or shall be a member of a base class of Y (this lookup applies in turn to Y ’s enclosing classes, starting with the innermost enclosing class),30 or — if X is a local class (9.8) or is a nested class of a local class, before the definition of class X in a block enclosing the definition of class X, or — if X is a member of namespace N, or is a nested class of a class that is a member of N, or is a local class or a nested class within a local class of a function that is a member of N, before the definition of class X in namespace N or in one of N ’s enclosing namespaces.
    и
    8 For the members of a class X, a name used in a member function body, in a default argument, in an exceptionspecification, in the brace-or-equal-initializer of a non-static data member (9.2), or in the definition of a class member outside of the definition of X, following the member’s declarator-id31, shall be declared in one of the following ways: — before its use in the block in which it is used or in an enclosing block (6.3), or — shall be a member of class X or be a member of a base class of X (10.2), or — if X is a nested class of class Y (9.7), shall be a member of Y, or shall be a member of a base class of Y (this lookup applies in turn to Y’s enclosing classes, starting with the innermost enclosing class),32 or — if X is a local class (9.8) or is a nested class of a local class, before the definition of class X in a block enclosing the definition of class X, or — if X is a member of namespace N, or is a nested class of a class that is a member of N, or is a local class or a nested class within a local class of a function that is a member of N, before the use of the name, in namespace N or in one of N ’s enclosing namespaces.
    И сноска 31
    31) That is, an unqualified name that occurs, for instance, in a type in the parameter-declaration-clause or in the exception specification.
    Эти же правила дублируются и в других разделах, где описание относится к классам.

    binding коллекции к listbox в xaml

    У меня есть коллекция public ObservableCollection MyCollection у класса MyClass есть интовое свойство.
    Так же есть листбокс, который я хочу заполнить объектами этой коллекции, при нажатии на каждый элемент в текстбоксе должно высвечиваться свойство выбранного элемента, но писать listBox1.DataSource/ItemsSource = ... - нельзя, надо делать биндинг только в xaml'e и я никак не разберусь, как это реализовать. коллекция заполнена и инициализирована


    Ответ

    Нужно завести свойство выбранного элемента в коллекции (Не забудьте о реализации INotifyPropertyChanged):
    public MyClass SelectedItem {get; set; }
    Далее в xaml делаете привязку к этому свойству:

    UPDATE
    Приведу код целиком:
    // модель представления элемента коллекции public sealed class CollectionItemVm : BaseVm { public int IntProperty { get { return _intProperty; } set { SetProperty(ref _intProperty, value); } } private int _intProperty; }
    // модель представления главного окна public sealed class MainVm : BaseVm { public ObservableCollection MyCollection { get { return _myCollection ?? (_myCollection = new ObservableCollection()); } } private ObservableCollection _myCollection;
    public CollectionItemVm SelectedItem { get { return _selectedItem; } set { SetProperty(ref _selectedItem, value); } } private CollectionItemVm _selectedItem;
    public MainVm() { MyCollection.Add(new CollectionItemVm { IntProperty = 1 }); MyCollection.Add(new CollectionItemVm { IntProperty = 2 });
    SelectedItem = MyCollection.Last(); } }
    // представление главного окна
    BaseVm реализация INotifyPropertyChanged. WpfApplication4.ViewModels - пространство имен, в котором расположен класс MainVm

    Сортировка многомерного массива с не порядковыми id

    Нужно отсортировать многомерный массив таким образом, чтобы элементы шли по возрастанию, по определенному параметру, но при это те элементы, параметр которых равен 0, были в самом низу.
    Дополнительную сложность создает то, что ключи массива — это id-шники элементов, и идут они не по порядку, т.е., 4432, 4457, 5000, к примеру.
    пример массива:
    { '4444'=>{id=>3, pole=>12 и тд..}, '4545'=>{id=>23, pole=>12322 и тд..} и тд.. }
    pole — это поле, по значению которого нужно будет фильтровать.
    Понимаю, что нужно это дело перебирать пузырьком, но на моменте понимая как вытащить следующий не порядковый айдишник из массива, мозг вскипел.
    Подскажите, как быть, и в какую сторону копать.


    Ответ

    Сортировать массивы в php гораздо проще и эффективнее не пузырьком, а готовыми функциями, некоторые из которых вторым параметром берут имя функции которая сравнивает между собой 2 элемента и возвращает +1 если первый элемент большое второго, -1 если меньше и 0 - если они равны. Для вашего случая код должен выглядеть примерно так:
    array("id"=>3, "pole"=>12), '3556'=>array("id"=>45, "pole"=>0), '4545'=>array("id"=>23, "pole"=>12322), '2557'=>array("id"=>49, "pole"=>0), '5555'=>array("id"=>54, "pole"=>111) ); function mysort($k1, $k2) { if($k1['pole']==0) return 1; if($k2['pole']==0) return -1; return $k1['pole']-$k2['pole']; }
    uasort($A,"mysort"); // Вот собственно uasort и сортирует массив с использованием mysort для сравнения элементов
    print_r($A); ?>
    Результат:
    Array ( [4444] => Array ([id] => 3 [pole] => 12 ) [5555] => Array ([id] => 54 [pole] => 111) [4545] => Array ([id] => 23 [pole] => 12322) [3556] => Array ([id] => 45 [pole] => 0) [2557] => Array ([id] => 49 [pole] => 0) )
    Но если не смотря на лучшую эффективность встроенной сортировки и краткость кода хочется работать с таким массивом вручную, то перебирать его надо foreach, запоминая предыдущий ключ массива (ну или вместе с содержимым, это как удобно):
    $prev=0; foreach($A as $key=>$val) { if(!$prev) {$prev=$key; continue;} print "$key <> $prev
    "; if($A[$key]['pole']==0 && $A[$prev]['pole']!=0) ... $prev=$key; }

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

    Есть программка. В нее зашит Zip архив. Сначала у меня происходит извлечение ресурса во временную папку
    File.WriteAllBytes(fileName, (byte[])Properties.Resources.ResourceManager.GetObject(res.Key));
    Затем уже архив распаковывается
    ZipFile.ExtractToDirectory(Path.Combine(TempDir, fileName), libsPath);
    Оба процесса занимают по 10 секунд. А как можно сразу распаковать архив из ресурсов, не имея файл на диске? Если, конечно, это возможно.


    Ответ

    Возможно, например. Для работы с Zip архивами использую библиотеку SharpZipLib. Ставится легко и быстро через Nuget.
    Взяв отсюда пример по распаковке Zip-архива, написал такую функцию(чуточку переделал ее)
    public static void ExtractZipFile(Stream inputStream, string password, string outFolder) { ZipFile zf = null; try { zf = new ZipFile(inputStream); if (!string.IsNullOrEmpty(password)) { zf.Password = password; // AES encrypted entries are handled automatically } foreach (ZipEntry zipEntry in zf) { if (!zipEntry.IsFile) { continue; // Ignore directories } String entryFileName = zipEntry.Name; // to remove the folder from the entry:- entryFileName = Path.GetFileName(entryFileName); // Optionally match entrynames against a selection list here to skip as desired. // The unpacked length is available in the zipEntry.Size property.
    byte[] buffer = new byte[4096]; // 4K is optimum Stream zipStream = zf.GetInputStream(zipEntry);
    // Manipulate the output filename here as desired. String fullZipToPath = Path.Combine(outFolder, entryFileName); string directoryName = Path.GetDirectoryName(fullZipToPath); if (directoryName.Length > 0) Directory.CreateDirectory(directoryName);
    // Unzip file in buffered chunks. This is just as fast as unpacking to a buffer the full size // of the file, but does not waste memory. // The "using" will close the stream even if an exception occurs. using (FileStream streamWriter = File.Create(fullZipToPath)) { StreamUtils.Copy(zipStream, streamWriter, buffer); } } } finally { if (zf != null) { zf.IsStreamOwner = true; // Makes close also shut the underlying stream zf.Close(); // Ensure we release resources } } }
    Теперь, создав из массива байт поток, можно вызвать эту функцию следующим образом
    Stream stream = new MemoryStream(byteArray); stream.Position = 0; ExtractZipFile(stream, "", @"DestFolder");

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

    Я удалил все приложения вконтакте с моей страницы. Но когда авторизуюсь с других сайтов- то авторизация проходит , то-есть те приложения всё так же имеют доступ к моим данным. Где увидеть список этих приложений и какие у них права? По-идее так может висеть приложение и сливать дяде мои данные и хотелось бы в этом разобраться.


    Ответ

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

    Рандомный текст на Python

    Как сделать рандомный текст на Python? Чтобы он выводил только 1 переменную из двух? Например, я беру две переменные с таким значением:
    import random
    role1 = "Мирный житель" role2 = "Мафия" role = randon.randomint(role1, role2)
    print("Вы - " + role)
    input("")
    И мне нужно, чтобы при выводе текста выводилась ТОЛЬКО ОДНА ПЕРЕМЕННАЯ. Причем с каждого раза - разная, то role1, то role2, то снова role1.
    Надеюсь, понятно объяснил. Я новичок в Python и прошу по подробнее отвечать.


    Ответ

    Случайный элемент из последовательности
    random.choice(seq) использует криптографически-небезопасный PRNG в Питоне, поэтому если вы его используете в контексте, где не желательно, чтобы можно было угадать результат последовательных вызовов, например, при генерации паролей, то следует использовать CSPRNG такой как random.SystemRandom(), который использует os.urandom(), который в свою очередь использует возможности, предоставляемые OS:
    #!/usr/bin/env python3 import random
    random_item = random.SystemRandom().choice(["Мирный житель", "Мафия"])
    See also: PEP 0506 -- Adding A Secrets Module To The Standard Library
    Каждый раз разная (неслучайная) строка
    Чтобы при каждом запуске программы можно было печатать разные значения из заданной последовательности, можно создать бесконечный итератор, используя itertools.cycle(), который по кругу возвращает элементы из этой последовательности. Чтобы сохранить состояние итератора между запусками программы, чтобы каждый раз следующее значение возвращалось, можно использовать pickle для сериализации:
    #!/usr/bin/env python3 """Print a different string on each run in a loop.""" import itertools import pathlib import pickle
    # load items path = pathlib.Path('it.pickle') try: data = path.read_bytes() # XXX no file locking, ignore concurrent issues except FileNotFoundError: # 1st run # create an infinite iterator that repeats the values it = itertools.cycle(iter({"Мирный житель", "Мафия"})) else: # NOTE: it is insecure if you can't trust it.pickle's content it = pickle.loads(data)
    # print next item print(next(it))
    # save items path.write_bytes(pickle.dumps(it)) # XXX ignore data corruption issues
    Чтобы избежать (маловероятного) повреждения файла (например, если питание вдруг пропадёт во время записи файла), можно использовать временный файл. See Threadsafe and fault-tolerant file writes

    Конфликт двух input и display: none

    Сделал табы (вкладки) через inputы типа radio потом, внутри этих вкладок, есть input уже типа text. Так вот, первые инпуты скрыл через display:none, проблема в том, что скрылись и вторые инпуты, которые тип текст имеют.
    /*Табы*/ /* Базовый контейнер табов */ .tabs { min-width: 30%; max-width: 80%; padding: 0px; margin: 0 auto; } /* стили секций с содержанием */ section { display: none; padding: 15px; background: #fff; border-top: 5px solid #3498db; width: 100%; } .tabs input { display: none; } /* стили вкладок (табов) */ .tabs label { display: inline-block; margin: 0 0 -1px; padding: 15px 25px; font-weight: 600; text-align: center; color: #aaa; } /* шрифт-иконки от Font Awesome в формате Unicode */ .tabs label:before { font-family: fontawesome; font-weight: normal; margin-right: 10px; } .tabs label[for*="1"]:before { content: "\f0e0"; } .tabs label[for*="2"]:before { content: "\f155"; } .tabs label[for*="3"]:before { content: "\f09d"; } /* изменения стиля заголовков вкладок при наведении */ .tabs label:hover { color: #888; cursor: pointer; } /* стили для активной вкладки */ .tabs input:checked + label { color: #fff; border: none; border-top: 1px solid #009933; border-bottom: 1px solid #fff; background: #3498db; } /* активация секций с помощью переключателя :checked */ #tab1:checked ~ #content1, #tab2:checked ~ #content2, #tab3:checked ~ #content3 { display: block; } /* медиа запросы для различных типов носителей */ @media screen and (max-width: 680px) { .tabs label { font-size: 0; } .tabs label:before { margin: 0; font-size: 18px; } } @media screen and (max-width: 400px) { .tabs label { padding: 15px; } } /*Работаем с формами*/ #form1 { margin:1em 0; padding-top:1%; } #form1 fieldset { margin:0; padding:0; float:left; display:inline; width:40%; margin-left:5%; background: #fff; border: none; } #form1 p {margin:.5em 0;} #form1 label {display:inline-block; border: none;} #form1 input, #form1 textarea { width:25%; border:1px solid #777777; -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; background:#fff; padding:3px; } #form1 textarea { height:5%; overflow:auto; } #form1 p.submit { clear:both; padding:0 25px 20px 25px; margin:0; text-align:right; } #form1 button { width:15%; height:6%; line-height:100%; border:none; background: #3498db; color:#fff; cursor:pointer; text-align:center; margin-left: 30%; } #form1 button:hover { background: #fff; color: #3498db; border: solid; }



    Ответ

    Вы скрываете все input'ы в блоке tabs
    .tabs input { display: none; }
    А нужно только дочерние (если я правильно понял):
    .tabs > input { display: none; }

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

    Вот пример – https://jsfiddle.net/8qzuq881/1/
    Я даже убрал отступы через стили:
    margin:0px; padding:0px;
    Но не помогает. Как убрать зазор?


    Ответ

    Добавьте display на картинку:
    div.pre-img>img { display: block; }
    Тогда браузеры будут точно прорисовывать ее размеры.

    Почему не работает вывод в файл?

    Не работает вывод в output.txt, IDE выдает ошибку
    ouf.write(result) io.UnsupportedOperation: not writable
    Код:
    with open('dataset_3363_2.txt') as inf: dnk = inf.readline()
    result = '' i = 0 kol = 0 let = '' while i != (len(dnk) - 1): if not ('0' <= dnk[i] <= '9'): for j in range(0, kol): result += let let = dnk[i] kol = 0 else: buf = str(kol) + dnk[i] kol = int(buf) i += 1 for i in range(0, kol): result += let
    with open('output.txt') as ouf: ouf.write(result)


    Ответ

    Тебе нужно явно указать, что ты открываешь файл для записи:
    with open('output.txt', 'w') as ouf: ouf.write(result)

    Как заменить стрелку (caret) select?

    Можно ли изменить стрелку справа (caret), не заменяя весь фон? То есть, я хочу иметь возможность заменить иконку стрелки, но не трогать остальной вид select.
    Видел решение, которое заменяет background целиком на новую картинку. Это решение рассматривать не будем.
    Использовать модифицированный button тоже не хотелось бы.


    Ответ

    может так?
    .select { position: relative; display: inline-block; } .select:after { content: "▼"; padding: 0 8px; font-size: 12px; position: absolute; right: 8px; top: 4px; z-index: 1; text-align: center; width: 10%; height: 100%; pointer-events: none; box-sizing: border-box; } select { padding-right: 25px; -webkit-appearance: none; -moz-appearance: none; appearance: none; }


    Сделать кроссбраузерно (так, чтобы выглядело везде одинаково), не получается, так как select не поддаются полной стилизации.

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

    Как составить sql mysql запрос для того чтобы пронумеровать по порядку записи в таблице в заранее подготовленой колонке ?
    Желательно 1 запросом если это реально.


    Ответ

    update table set field=@num:=@num+1 where 0 in(select @num:=0)
    Нумерация пойдет с 1. При желании можно подправить стартовое значение и способ вычисления следующего

    Удаление бесполезного кода компилятором

    Рассмотрим простой код.
    void f() { }
    // ...
    f();
    Ясно, что функция f не делает ничего (точнее, не делает никакой полезной работы), поэтому компилятор может её спокойно "выбросить" без изменения поведения программы. (Вариант обращения к памяти за вершиной стека чтобы "сцапать" оттуда адрес возврата не берём, ибо "грязный хак", да ещё может и не сработать.)
    Усложним задачу:
    void g(int x) { }
    int calc_x() { // Долго и упорно что-то вычисляем. }
    // ...
    g(42); // Ни на что не влияет. g(calc_x()); // А вот тут непонятно...
    Ясно, что g(42) можно выкинуть. Но выкинуть g(calc_x()) в общем случае нельзя, поскольку у calc_x могут быть побочные эффекты.
    Соответственно, вопрос: при каких условиях компилятор будет иметь право выбрасывать вызовы функции g?
    P.S. Я понимаю, что компилятор может оставить даже вызов f(), если отключены все оптимизации. Вопрос следует понимать именно так, как написано - не выбросит, а имеет право выбросить


    Ответ

    Компилятор может превратить вызов g(calc_x()); в следующий [псевдо]код:
    int x = ...; calc_x код x теперь чем-то проинициализирован. Здесь мог бы быть код из g, но его там нет. Увы.
    Т.е. компилятор заинлайнил обе функции, после чего он смотрит, что x нигде не используется и на этом этапе он может выкинуть код вообще.
    Для примера, вот такой C++ код:
    void g(int x) { }
    int calc_x() { int x = 0; while(x < 500) { ++x; } return x; }
    int main() { g(42); g(calc_x()); }
    Превращается в вот такой ассемблер(и в студии, и в gcc):
    main: xor eax, eax ret

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

    PDO ошибка выборки c LIMIT

    Почему выдает ошибку при таком запросе?
    $num = 10; $start = 1; $sql = "SELECT * FROM `users_for_events` LIMIT ?, ? "; $data = array($start, $num); $stmt = $this->getCon()->prepare($sql); $stmt->execute($data); $stmt->fetchAll(); var_dump($stmt->fetchAll());
    Ошибка вот такого плана:
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1327 Undeclared variable: '1'' in


    Ответ

    В режиме эмуляции все переданные через execute() переменные PDO подставляет в запрос как строки, и в итоге запрос получается
    LIMIT '10', '1'
    что вызывает ошибку. Самым простым решением будет отключить режим эмуляции сразу после соединения,
    $conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
    и после этого данный код сразу заработает без ошибок.

    Ошибка: “Cannot read property 'top' of undefined” при создании прокрутки

    По идее вот так
    var destination = jQuery("#job").offset().top; if (jQuery.browser.safari) { jQuery('body').animate({ scrollTop: destination }, 1100); //1100 - скорость прокрутки } else { jQuery('html').animate({ scrollTop: destination }, 1100); } return false;
    Должно работать, но ничего не скролится. jQuery подключен. Пишет,
    Cannot read property 'top' of undefined

    Вопрос из ответа @Алексей Дементьев.


    Ответ

    В данном случае jQuery("#job").offset() - возвращает undefined, а это возможно только в случае когда jQuery("#job") не нашел элементов, удовлетворяющих селектору.
    Кроме того в зависимости от версии jQuery при применении этого метода, так же может быть возвращено null, следовательно ошибка может меняться на
    Uncaught TypeError: Cannot read property 'top' of null(…)

    Как передать переменную в функцию при помощи сигнал-слота?

    Начал изучать Qt и в качестве закрепления информации решил создать проект, в котором вектор пушБаттонов будет посылать сигнал в функцию, функция в свою очередь производит вычисления, сохраняет в SQLite базу и выводит на соответствующий ЛайнЕдит (тоже вектор). Однако, на этапе объединения, кнопки и функции, я столкнулся с трудностями так как не знаю, как это можно правильно организовать.
    Моя изначальная идея была в том, чтобы создать цикл, который бы объединял баттоны с функцией и передавал значения i, для определения с какой именно кнопки поступил сигнал, что вроде этого:
    for(int i = 0; i < max; i++) { QObject::connect(button[i], &QPushButton::clicked, this, MainWindow::function); }
    Однако, я не нашел способа передать значение i в функцию. Слышал про QSingalMapper и использования лямбды, но из-за недостатка опыта так и не разобрался как это можно реализовать.
    Буду признателен, если продемонстрируете, как в таком случае можно перекинуть i внутрь функции. Или, если моя идея неверна в принципе, предложите другой вариант ее реализации.


    Ответ

    С использованием лямбда-функций всё намного проще:
    connect(button[i], &QPushButton::clicked, this, [=] () { function(i); });
    В зависимости от того какие переменные необходимо захватить в контекст лямбда-функции, слот может выглядеть по-другому:
    connect(button[i], &QPushButton::clicked, this, [this, i] () { function(i); });
    Такой функционал доступен, начиная с C++11

    Как сравнить числовые данные, переданные с помощью нескольких интентов в другое активити

    Есть активити1, которое передает в активити2 для счетчика количество миллисекунд. Количество миллисекунд может быть разным (в зависимости от того, какая кнопка нажата на активити1).Счетчик в активити2 должен принимать эти значение миллисекунд.
    В активити1 код для передачи данных такой:
    int SEKOND;
    @Override public void onClick(View v) { switch (v.getId()){ case R.id.button_dif SEKOND = 5000; Intent intent = new Intent(this,Activity2.class); intent.putExtra("sekondDif",SEKOND); startActivity(intent); break; case R.id.button_is: SEKOND = 50000; Intent intent1 = new Intent(this,Activity2.class); intent1.putExtra("sekondIs",SEKOND); startActivity(intent1); break;
    } }
    В ативити2 код получения интентов такой:
    Bundle extras = getIntent().getExtras();
    int id0 = extras.getInt("sekondDif"); int id1 = extras.getInt("sekondIs");
    Т.е. число передано и извлечено.
    Далее есть счетчик, вместо id которого нужно поставить либо данные из id0 либо из id1, в зависимости от того, какой интент был получен:
    new CountDownTimer(id, 1000) {}
    Сама логика такая: на активити1 есть разные button. Если кликнуть по button1, то при переходе на активити2 в счетчике должно быть выставлено одно количество миллисекунд, если кликнуть на активтити1 по button2, то в счетчике должно быть выставлено другое количество миллисекунд.
    Помогите, пожалуйста, связать эти условия (секунды счетчика на втором активити и выбор кнопки на первом активити ).


    Ответ

    Если ваша проблема в том, что вы не знаете во второй активити какое именно значение было передано из первой, то вы можете, при вытаскивании данных из интента указывать значение по умолчанию для отсутствующих данных и проверяя ваши переменные второй активити на предмет равенства значения по умолчанию вызывать метод нужный передавая туда нужную переменную.
    Bundle extras = getIntent().getExtras();
    //зададим -1 как значение по умолчанию. //им будет инициализированна переменная, если в Bundle нет искомого ключа. //если этот аргумент не указать и значения по ключу нет, то присвоится 0 int id0 = extras.getInt("sekondDif", -1); int id1 = extras.getInt("sekondIs", -1);
    if(id0 != -1) { //значит получено "sekondDif" } else if(id1 != -1) { //значит получено "sekondIs" }

    Также можно проверять есть ли определённый ключ в Bundle методом contains(String key)

    В каких ветках есть локальные изменения

    Как узнать, какие ветки содержат закоммиченные, но ещё не запушенные изменения?


    Ответ

    примерно так:
    $ git branch -vv * master c488ea5 [origin/master: ahead 1, behind 1] 20160210184133 test ffc6775 [origin/test: ahead 1] 20160210183855 test2 ffc6775 [origin/test2: behind 1] 20160210183855 test3 7ff0eab 20160210184754
    здесь мы видим, что ветки master, test и test2 «привязаны» к удалённым репозиториям (показано и имя репозитория и ветка «привязки»).
    также видно, что ветки master и test отстоят на один коммит каждая «впереди» (ahead 1), а master и test2 «позади» (behind 1) от содержимого удалённого репозитория.

    дополнительный вопрос, поднятый в комментариях
    Как его сократить только до веток, у которых есть ahead/behind? И как убрать commit message из таблицы?
    с помощью опций команды branch, по-моему, никак. можно «порезать» вывод чем-то внешним. например, если доступна программа gnu/sed
    $ git branch -vv | sed -rn 's/(: (ahead|behind) [0-9]+[^]]*\]).*/\1/p' * master c488ea5 [origin/master: ahead 1, behind 1] test ffc6775 [origin/test: ahead 1] test2 ffc6775 [origin/test2: behind 1]

    Ошибка 6 (неверный дескриптор) - в чём причина?

    Для начала мне требуется найти некоторый файл:
    HANDLE hExample4; HANDLE hExample24; WIN32_FIND_DATA fd; hExample4 = FindFirstFile("Example4.bin",&fd); hExample24 = FindFirstFile("Example24.bin",&fd);
    Так вот, после того, как я начинаю работать с этими дескрипторами, вызов любой функции типа SetEndOfFile(), GetFileSize() и т. д. выдаёт ошибку, а при вызове GetLastError() можно увидеть, что это ошибка 6 (неверный дескриптор).
    Что тут не так?


    Ответ

    FindFirstFile возвращает дескриптор поиска(не тот дескриптор, который создается при открытии файла с помощью функции CreateFile, назовем его файловый дескриптор). Поэтому вы его не можете использовать в функциях для работы с файлами типа SetEndOfFile, GetFileSize. Дескриптор поиска вы можете использовать только для дальнейшего поиска других файлов с помощью функции FindNextFile
    Когда дескриптор поиска больше не нужен, вы его должны закрыть с помощью функции FindClose, именно с помощью этой функции, а не с помощью функции CloseHandle, который мы закрываем файловый дескриптор, когда создаем его с помощью функции CreateFile
    Поэтому если вы нашли этот файл, то для получения файлового дескриптора вызовите функцию CreateFile с флагом OPEN_EXISTING, если вам он действительно нужен.
    P.S Функция FindFirstFile возвращает структуру LPWIN32_FIND_DATA, из которой вы можете получить размер файла во так
    LARGE_INTEGER filesize; filesize.LowPart = fd.nFileSizeLow; filesize.HighPart = fd.nFileSizeHigh; _tprintf(TEXT(" %s %ld bytes
    "), fd.cFileName, filesize.QuadPart);
    FindFirstFile Function Listing the Files in Directory Example

    PHP PDO в чем разница ATTR_EMULATE_PREPARES, false и true

    Пробовал вставлять значения разных типов данных в колонки с разными типами данных при ATTR_EMULATE_PREPARES, false и true, разницы не увидел, может кто объяснить в чем отличие?
    //типы колонов r1 = int, r2 = varchar, r3 = bool
    $pdo = new PDO('mysql:host=localhost;dbname=test;charser=utf8', 'root', ''); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $smt = $pdo->prepare('INSERT INTO pwnd (r1, r2 ,r3) VALUES (:r1, :r2, :r3)'); echo $smt->execute([':r1' => 'a2', ':r3' => 'false', ':r2' => true]);


    Ответ

    С PDO::ATTR_EMULATE_PREPARES в значении true за обработку подготовленных выражений отвечает сам PDO. В базу данных передаётся чистый запрос с уже подставленными и корректно экранированными данными (только в dsn не забывайте правильно charset указывать).
    PDO::ATTR_EMULATE_PREPARES в значении false именно использует штатный механизм СУБД для подготовки запроса и затем отдельным обращением передаёт данные для этого запроса. Т.е. нормальные, реальные подготовленные выражения.
    Из не очевидных моментов:
    для сложных запросов дико удобно использовать именованные параметры несколько раз. Какой-нибудь where user_from = :id or user_to = :id и передать только один id. Такое возможно только с эмуляцией запросов. специфика конкретных СУБД. Какие-то СУБД из тех, что умеет PDO могут не уметь подготовленные выражения. Например, очень популярный PgBouncer (пул коннектов для PostgreSQL) не умеет обрабатывать подготовленные выражения. С эмуляцией выражений можно в коде проекта пользоваться удобствами API с prepare вопрос с тем, что подготовленный запрос разбирается и строит план один раз и затем только выполняется - на самом деле гораздо сложнее. Тот же mysql сохраняет запрос только в рамках соединения. Поэтому в типичном сценарии использования "подготовил, выполнил, закрыл соединение" никаких плюсов реальное препарирование не даёт. А кэширование плана между соединениями - по-моему (сам с этой СУБД не работал), есть в Oracle и приносит некоторое количество головной боли, ведь оптимальный план запроса в немалой степени зависит от самих данных.

    Диалог с предложением включить GPS

    Когда заходишь в Google Maps и у тебя выключен GPS, Андроид тебе предложит включить его диалогом с двумя кнопками. При нажатии на ОК - GPS включится.
    Как сделать такой же диалог в своем приложении ?
    И да, я правильно понимаю, что программно я никак не могу включить GPS без спрашивания пользователя ?


    Ответ

    Опросите систему включен ли GPS.
    public boolean isGeoDisabled() { LocationManager mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); boolean mIsGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); boolean mIsNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); boolean mIsGeoDisabled = !mIsGPSEnabled && !mIsNetworkEnabled; return mIsGeoDisabled; }
    если нет, покажите диалог с предложением включить, при согласии отправьте пользователя в настройки
    startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));

    Цвет строки заголовка

    Как в uwp программно изменить цвет строки заголовка?

    Спасибо.


    Ответ

    using Windows.UI; using Windows.UI.ViewManagement;
    ...
    var view = ApplicationView.GetForCurrentView(); view.TitleBar.BackgroundColor = Colors.DarkGreen;
    Другие возможности по кастомизации цвета тут

    Существует пример реализации ViewPager внутри DialogFragmen?

    Есть примеры кода реализации ViewPager внутри какого либо DialogFragment? Находил некоторые примеры, но каждый раз возникали разные ошибки которые не позволяли понять в чем все таки проблема, по сему прошу полный пример от и до содержащий по возможности xml


    Ответ


    Tab_1.class
    public class Tab_1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_1, container, false); } }
    Tab_2.class
    public class Tab_2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_2, container, false); } }
    Tab_3.class
    public class Tab_3 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_3, container, false); } }
    tab_1.xml


    tab_2.xml


    tab_3.xml


    MainActivity.class
    Кнопка вызова кастомного диалога.
    public class MainActivity extends AppCompatActivity {
    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
    public void onClick(View v){ new FragmentsPopup().show(getSupportFragmentManager(), ""); } }
    activity_main.xml

    Конструкция *++argv[0] в языке Си

    Как в этом примере использования указателей работает конструкция *++argv[0] во внутреннем цикле?
    #include #include
    int main(int argc, char *argv[]) { int c, except = 0, number = 0;
    while(--argc > 0 && (*++argv)[0] == '-') { printf("argv = %s
    ", *argv); while(c = *++argv[0]) switch(c){ case 'x': except = 1; break; case 'n': number = 1; break; default: printf("Illegal option: %c
    ", c); argc = 0; break; }
    }
    printf("[DEBUG]: argc = %d
    ", argc);
    if(argc != 1) printf("Usage: -x -n
    "); else printf("x = %d, n = %d
    ", except, number); return 0; }
    Разберу похожую конструкцию (*++argv)[0] во внешнем цикле. Здесь берется нулевой символ строки, которая содержит один из аргументов. Скобки [] имеют более высокий приоритет, чем инкремент и ссылка, поэтому *++argv заключается в скобки. Нулевой элемент массива argv это указатель на имя программы, поэтому инкрементом переходим к следующий строке. После этого разыменовываем указатель и получаем строку. Применение скобок [0] дает нулевой символ этой строки.
    Конструкция *++argv[0] мне совсем непонятна. Здесь должен быть проход по строке-аргументу. Это нужно для того, чтобы поддерживались не только ключи типа -x -n, но и ключи вида -nx. Для чего здесь [0]? Как работает выражение целиком?


    Ответ

    Ну а здесь просто проход посимвольно - как вы написали сами, квадратные скобки имеют более высокий приоритет, так что просто увеличивается указатель argv[0], который изначально указывает на начало строки аргументов, а разыменование дает очередной символ...
    Т.е. если вызывается программа так, что argv[1] == -abcxn, то после первой строки (++argv)[0] указатель argv[0] указывает на строку -abcxn. Первое разыменование (в первом while) дает '-', затем, во втором while, просто перебираются все символы строки - a, b, c, x, n

    Как сделать, чтобы EditText не увеличивался по сторонам?

    Как сделать, чтобы EditText не увеличивался в стороны, когда в него вводят текст?

    Код разметки (EditText'ы в первых двух LinearLayout'ах):










    Функция, принимающая указатель на другую функцию

    Функция принимает в аргумент указатель на другую функцию. Как правильно объявить прототип?


    Ответ

    С++: посредством typedef
    Неформально:
    typedef ReturnType(*FunctionPtr)(Parm1Type, Parm2Type, ...);
    Прототип:
    typedef void(*FunctionPtr)(); void func(const FunctionPtr& functionPtr);
    Пример кода:
    void parmFunc(){}
    typedef void(*FunctionPtr)(); void func(const FunctionPtr& functionPtr){ functionPtr(); }
    int main() { func(&parmFunc); }

    С++11: посредством using
    Неформально:
    using FunctionPtr = ReturnType(*)(Parm1Type, Parm2Type, ...);
    Прототип:
    using FunctionPtr = void(*)(); void func(const FunctionPtr& functionPtr);
    Пример кода:
    void parmFunc(){}
    using FunctionPtr = void(*)(); void func(const FunctionPtr& functionPtr){ functionPtr(); }
    int main() { func(&parmFunc); // вариант 1 func([](){/* code of your function */}); // вариант 2 }

    C++11: посредством std::function
    Неформально:
    using FunctionPtr = std::function;
    Прототип:
    #include
    using FunctionPtr = std::function; void func(const FunctionPtr& functionPtr);
    Пример кода:
    #include
    void parmFunc(){}
    using FunctionPtr = std::function; void func(const FunctionPtr& functionPtr){ functionPtr(); }
    int main() { func(&parmFunc); // вариант 1 func(std::bind(parmFunc)); // вариант 2 func([](){/* code of your function */}); // вариант 3 }

    Если ваша функция должна возвращать значение и/или принимать параметры, то смотрите неформальное описание в данном ответе.

    Какой формат у nginx.conf?

    Работаю с файлами конфигурации nginx. Они имеют формат, который мне ранее не встречался: что-то похожее на смесь .ini и JSON:
    user www www; ## Default: nobody worker_processes 5; ## Default: 1 error_log logs/error.log; pid logs/nginx.pid; worker_rlimit_nofile 8192;
    events { worker_connections 4096; ## Default: 1024 }
    Хочу привязать к этим файлам какой-то конкретный формат в среде разработки (PyCharm), чтобы получить подсветку синтаксиса, автоформат и прочие плюшки.
    Вопрос: а как этот формат вообще называется? У него есть какая-нибудь спецификация?
    Предположил, что это так и называется - configuration file. Но там нет ни слова про блоки в фигурных скобках.


    Ответ

    Так можно просто взять готовый плагин https://plugins.jetbrains.com/plugin/4415. Подсветка синтаксиса там есть
    Configuration file syntax highlighting, auto-completion and inspections.

    Функция нахождения максимума

    Почему функция
    int max1(int x,int y) { return x>y ? x : y; }
    работает медленнее, чем
    int max2(int x,int y) { return x?
    Вот нашёл статью про это даже (в конце таблицы сравнения скоростей)
    Вот моё сравнение:
    #include #include #include #include #include #include int max1(int x,int y) { return x>y ? x : y; } int max2(int x,int y) { return x> v(size); std::for_each(v.begin(),v.end(),[](std::pair& x){x=std::make_pair(std::rand(),std::rand());}); unsigned int start1 = clock(); for (auto i : v) max1(i.first,i.second); unsigned int end1 = clock(); std::cout << end1-start1 << std::endl; unsigned int start2 = clock(); for (auto i : v) max2(i.first,i.second); unsigned int end2 = clock(); std::cout << end2-start2 << std::endl; }


    Ответ

    Я как раз недавно рассматривал подобный вопрос в этой статье (в самом конце).
    У меня получилось так, что на архитектуре x86 всё зависит от порядка сравнения. Если x сравнивается с y, то компилятор даёт одну последовательность команд, а если наоборот, то другую последовательность тех же самых команд. Причина разницы в скорости, видимо, в особенностях микроархитектуры. Одна последовательность команд, видимо, лучше ложится на конвейер или ещё какие-то сторонние факторы влияют.
    Это общая беда, наверное, всех процессоров Intel. Аналогично, я заметил, что команда inc eax будет работать медленнее, чем lea eax, [eax+1]. Подобных приколов, наверное, ещё много.

    Перегрузка оператора “+” в шаблоне

    Здравствуйте. Столкнулся с проблемой: не могу правильно перегрузить оператор сложения в шаблоне класса. Может кто показать мне мою ошибку? Тип данных массива в шаблоне может быть char,int, float, double. Должно поддерживаться сложение разных типов данных (т.е. если первый объект с параметром int, а второй - с параметром double, то метод должен возвращать объект с параметром double).
    #pragma once template class Vector { T *data; size_t size; public: Vector(); Vector(size_t size); ~Vector(); size_t getSize(); void SetAll(); void ClearAll(); void SetVectorSize(size_t); T operator [](int); template< typename U > Vector & operator+(Vector &B); };
    cpp файл:
    #include "stdafx.h" #include "Vector.h" #include #include ... ... template template inline Vector & Vector::operator+(Vector& B) { if (sizeof(this->data[0]) > sizeof(B.data[0])) { Vector obj; } else { Vector obj; } obj.data[0] = 1; return obj; }


    Ответ

    Если я верно понял, что вы хотите, то решение примерно такое -
    template Vector> operator+(const Vector&) const { Vector> x; // складываете, как вам надо ....... return x; }
    Код
    Vector a; Vector b; auto c = a+b; cout << typeid(c).name() << endl;
    даст Vector
    И еще - вы должны объявить этот оператор как возвращающий вектор нового типа, а не ссылку - иначе вы по сути вынуждены возвращать ссылку на свой объект, а его тип предопределен.
    Update В принципе, можно как-то так - но, как мне кажется, это будет совсем не так красиво:
    template auto operator+(const Vector&A) const { Vector x; return x; }
    Т.е. даем компилятору самому решить, какой тип имеет сумма, и этот тип используем для типа возвращаемого значения.

    Как правильно хранить куски текста в одном файле?

    Есть файл с простой разметкой (как .ini). Разметка например такая:
    [A1] 1=Текст A1-№1 2=Текст A1-№2
    ..........
    [A2] 1=Текст A2-№1 2=Текст A2-№2
    Как правильно и в какой папке хранить такие текстовые файлы, из которых я собираюсь формировать текст для вывода в TextView? Как формировать запрос на поиск нужного текста с такой разметкой? Может в JAVA есть аналог ini разметки?


    Ответ

    Для хранения произвольных файлов в структуре приложения Android выделены папки /assets и /res/raw. Доступ к этим ресурсам возможен только на чтение.
    Различия кроются в способе доступа и организации хранения этих файлов.
    Ресурсы в папке /assets могут иметь произвольную структуру подкаталогов, имен файлов и доступ к ним организуется через класс AssetManager, отдельные файлы не имеют идентификаторов в классе R.java, доступ к ним организуется напрямую по имени файла. Подробнее про ресурсы /assets
    Ресурсы в папке /res/raw не могут иметь структуры подкаталогов, доступ к ним осуществляется по идентификатору, заданному в R.java, через синтаксис R.raw.*. Так же такие файлы несколько ограничены типом - разрешено хранить аудио, видео, html-страницы, текстовые файлы и тп. Подробнее о каталоге res/raw/
    Кроме того, существует каталог /res/xml/, в котором можно хранить произвольные XML файлы (файлы структурированой информации, аналогичной той, которая представлена в вашем вопросе). Ресурсы так же имеют идентификаторы в R.java и обращаются к ним через R.xml.*. Подробнее
    Перечисленные выше места хранения используются только для хранения статической информации - ее можно читать, но нельзя изменить или (до-)переписать. Если вам требуется доступ и на запись, то в таком случае файлы хранятся вне структуры приложения, на внешнем носителе. По умолчанию система Android выделяет для каждого приложения область на внешнем диске (по пути /data/data/), куда программа может записывать и считывать данные, но вы так же можете указать произвольное место работы (каталог), например, на SD-карте
    Отличие в хранении в выделенной для приложения области в том, что эта область никаким образом недоступна другим приложениям (за исключением приложений с root-правами), так же при удалении приложения эта область удаляется вместе с ним. При хранении на SD-карте, доступ к данным может получить кто угодно и они не уничтожаются вместе с приложением при его деинсталяции.
    Альтернативным способом хранения может быть запись значений в таблицу SQLite. Этот способ оправдан при необходимости делать произвольные выборки, а так же связывать различные данные (содержимое таблиц) между собой, так как организация работы с БД требует больших трудозатрат и дополнительных знаний в области СУБД - при простом хранении набора данных выгоднее и "дешевле" хранить его в структурированном файле. Тем не менее, вы так же можете подготовить БД и разместить ее в каталоге /assets, а затем скопировать на устройство (один из примеров). При этом база данных с которой могут работать классы Android может располагаться только в специальной выделенной области приложения по пути */data/data//database/*. При размещении в любом другом месте (например на SD-карте), Android не сможет с ней работать (либо вам придется написать свои классы работы с БД, которые смогут это делать). Размер самого файла БД несущественно больше размера хранимых в нем данных - этим в свете экономии места на диске можно пренебречь.
    Аналоги INI файлов со встроенными в Android API инструментами для обработки - файлы форматов JSON и XML.
    При довольно распространенном паттерне, когда требуется какой то заполненный данными файл, который потом необходимо модифицировать, поступают следующим образом: файл помещают в каталог /assets, при старте приложения его копируют оттуда в область выделенную приложению или на SD-карту и затем уже работают с скопированным файлом. Файл в /assets при этом остается в первоначальном состоянии и фактически является балластом, но ничего не поделаешь. Так же есть вариант создание файла динамически из кода, в некоторых случаях это позволяет существенно сократить объем приложения, то же относится и к заполнению таблиц SQLite.

    Как выполнить действие после отрисовки Activity (fragment)

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


    Ответ

    К примеру у вас есть View mExampleView повесьте на нее обсервер, он сработает, как только вьюшка будет нарисована на экране. Когда будет вызван onGlobalLayout, вы можете узнать ее размер, затем отпишитесь и выполняйте нужный код.
    ViewTreeObserver viewTreeObserver = mExampleView.getViewTreeObserver(); viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mEaxampleView.getHeight(); // будет больше 0 mEaxampleView.getViewTreeObserver().removeGlobalOnLayoutListener(this); // Остальные действия } });

    Время с 1900 года

    Есть дата в секундах с 1 января 1900 года: -699848845. Как вычислить нормальную дату?


    Ответ

    Старое API (до Java 8):
    Calendar cal = new GregorianCalendar(); cal.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); // не указано, в какой зоне 1 января 1900, будет в UTC cal.clear(); cal.set( 1900, 0, 1 ); // январь - нулевой месяц
    SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.SSS zzzz" ); format.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
    System.out.println( format.format( cal.getTime() ) ); // 1900-01-01 00:00:00.000 Coordinated Universal Time
    cal.add( Calendar.SECOND, -699_848_845 ); System.out.println( format.format( cal.getTime() ) ); // 1877-10-27 21:32:35.000 Coordinated Universal Time
    Новое API (Java 8 java.time):
    LocalDateTime result = LocalDateTime.of( 1900, 1, 1, 0, 0 ) // январь - 1 месяц .plusSeconds( -699_848_845 ); System.out.println( result ); // 1877-10-27T21:32:35
    Результат выводится в современном календаре (ISO-8601), без учета временной зоны. Для дремучего прошлого, возможно, придется подключать ThreeTen-extra, где есть реализация юлианского календаря, и разбираться в предмете подробнее.

    Вывести права доступа к файлам в восьмиричный системе

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


    Ответ

    например, можно воспользоваться программой stat
    $ stat --printf='%a %n
    ' * 777 file1 644 file2 1777 file3
    подробнее — man stat

    Как отключить подчёркивание красными волнистыми линиями в Visual Studio для проектов QT?

    Создаю проект qt в Visual Studio.Проект полностью собирается и работает, но раздражают подчёркивания намекающие на ошибки. Как от этого избавится?


    Ответ

    Для того что бы решить эту проблему нужно в настройках проекта в верхнем выпадающем списке Конфигурации выбрать Все конфигурации. Дальше надо зайти в Свойства и конфигурации -> C/C++ и в пункте "Дополнительные каталоги включаем" вручную прописать пути к библиотеке QApplication которая, в моём случае, лежит по пути C:\Qt\Qt5.6.0\5.6\msvc2013_64\include\QtWidgets\5.6.0\QtWidgets.
    Кому лень читать, можно посмотреть видео. Но там другие пути прописываются, которые в моём случае, проблему не исправили.

    Взять из строки слова которые начинаются с большой буквы

    Есть текст, из которого надо взять слова начинающиеся с большой буквы.
    решИла нЕ Упрощать и зашифРОВАтЬ Все послаНИЕ дАже не Старайся нИЧЕГО у тЕбя нЕ получится с расшифРОВкой Сдавайся НЕ твоего ума Ты не споСОбЕн Но может быть если особенно упорно подойдешь к делу
    будет Трудно конечнО Код ведЬ не из простых очень ХОРОШИЙ код то у тебя все получится и я буДу Писать тЕбЕ еще
    чао
    мой код
    data.Split(' ').Select(x => x).Where(x=>char.IsUpper(x[0])).Reverse().ToList();
    Почему то он не берет все слова которые начинаются с большой буквы. Мой результат
    Писать ХОРОШИЙ Трудно Но Ты НЕ Старайся Все Упрощать
    А должно получиться
    Писать ХОРОШИЙ Код Трудно Но Ты НЕ Сдавайся Старайся Все Упрощать
    Что в моем коде не так*


    Ответ

    Думаю, проблема в том, что вы делите по пробелу, а нужно включить в разделяющие символы ещё и конец строки (и Tab, наверное).
    Ещё одна потенциальная проблема: Вы берёте первый символ слова, не проверив длину слова.
    Ну и конструкция Select(x => x) не изменяет последовательность и таким образом не нужна.

    Не работает сильно приватное свойство в Python3 через __свойство, подскажите?

    Изучаю Python3, дошел до инкапсуляции и тут я не могу понять. Если правильно понял, то __ у свойства класса говорит о том, что напрямую к этому методу обратиться через obj.__variable нельзя, правильно?
    Но у меня не получается сделать приватным свойство, пробовал и через __init__(), и просто в теле класса __ создавать.
    Через сеттер-геттер нормально работает, но и напрямую через obj.__variable могут изменять и считывать значение.
    Скажите пожалуйста, где я ошибся? Не хочется идти дальше, не поняв этой важной темы.
    Код:
    # Создаем класс Auto class Auto: # Инициализация def __init__(self): self.__number = "" print("Создали класс Auto")
    # Свойства # Номер автомобиля, сильно приватное свойство, т.к. __ префикс и обратиться напрямую нельзя через obj.__свойство #__number = ""
    # Сеттер def set_number(self, number): # Валидация данных if len(number) in [7, 8]: self.__number = number else: print("Номер автомобиля неправильный, задайте 7 или 8 цифр.") # Геттер def get_number(self): return self.__number
    # Создаем объект Audi audi = Auto()
    # Задаем значение audi.__number через сеттер и считываем через геттер audi.set_number("A777SD77") print(audi.get_number())
    # Пытаемся задать или прочитать свойство с сильной приватностью __number напрямую - нельзя, т.к. сильно приватное audi.__number = "L123OX23" print(audi.__number)
    # Считываем значение изначального __number через геттер, а не созданного извне _Auto__number, оно не изменилось print(audi.get_number())
    Результат:
    Создали класс Auto A777SD77 L123OX23
    Process finished with exit code 0


    Ответ

    Это происходит потому, что на предпоследней строке (audi.__number = …) вы создаёте новый атрибут извне, точное имя которого __number Созданный вами атрибут __number изнутри класса на самом деле получает имя _Auto__number, что как раз и является показателем приватности.
    Приватные атрибуты это не жёсткое правило, а просто соглашение. Если по каким-то причинам нужно получить доступ к такому атрибуту, то программист может это сделать.
    Подробнее: https://docs.python.org/3/tutorial/classes.html#private-variables

    Поворот текстуры и движение на определённый угол Unity 5

    Есть текстура, бегает в неком радиуса, стукаясь об стенки - получает новое направление.
    Vector2 dir;
    void Start() { InvokeRepeating("Move", 1 / 24f, 1 / 24f); dir = Vector2.right; }
    void Update() {
    }
    void Move() { transform.Translate(dir); }
    void OnTriggerEnter2D(Collider2D coll) {
    if (coll.name.StartsWith("bright")) { dir = -Vector2.right; } if (coll.name.StartsWith("bleft")) { dir = Vector2.right; }
    if (coll.name.StartsWith("btop")) { dir = Vector2.down; } }
    Хочу чтобы текстура бегала не (вверх\низ\лево\право) а на определённый угол Пробовал так
    dir = Vector(0, 1);
    Но подчёркивает красным. Как на 45* допустим повернуть?
    А соответственный вопрос - как повернуть на случайный угол? На случайный, кроме допустим, 0?


    Ответ

    1) Конструкция вида dir = Vector(0, 1); не работает потому, что нужно писать Vector2/Vector3, а не просто Vector. И так как вы не обращаетесь к свойству как здесь
    Vector2.down;
    то значит надо обращаться к экземпляру класса, т.е. надо писать
    dir = new Vector2(0, 1);
    2) Даже если писать new Vector2(0, 1) в теории он должен полететь строго вверх, но никак не под углом. Для этого нужно объект либо повернуть, либо так и указать new Vector2(1, 1), т.е. лететь вверх и вправо, т.е. под углом
    3) При отскоке от сторон на одинаковый угол достаточно помнить, что при достижении какой-либо стороны - скорость меняется на противоположную (без учета сил трения, сил отскока и прочего). А-ля угол падения равен углу отражения. А значит при достижении правой или левой стороны (то есть ось X), достаточно изменить направление движение на противоположное для данной оси: X = -X;. А так как по вертикали он (объект) итак будет двигаться в заданном направлении, то получится отскок на угол. С отскоком по вертикали все точно также.
    Из вышесказанного следует:
    Vector2 dir; Transform myTransform;
    public float vx = 1f; public float vy = 1f; public float speed = 1f;
    void Start() { //InvokeRepeating("Move", 0.07f, 0.07f); myTransform =transform; dir = new Vector2(vx, vy); }
    void Update() { myTransform.Translate(dir * speed * Time.deltaTime); }
    // void Move() { transform.Translate(dir * speed * Time.deltaTime); }
    void OnCollisionEnter2D(Collision2D coll) {
    if (coll.gameObject.name.StartsWith("bright") || coll.gameObject.name.StartsWith("bleft")) { vx = -vx; }
    if (coll.gameObject.name.StartsWith("btop") || coll.gameObject.name.StartsWith("bbottom")) { vy = -vy; }
    dir = new Vector2(vx, vy); }
    4) По поводу рандома. Можно использовать две вещи
    Собственно класс из .Net: System.Random Из Unity: Random.Range - который сгенерирует число в заданном диапазоне
    Например вместо
    vx = -vx;
    можно написать
    var sign = Mathf.Sign(vx); var random = Random.Range(1f, 2f);
    vx = random * sign * -1;
    vx примет значение в диапазоне от 1 до 2. sign - нужен здесь, чтоб установить корректно значение vx, ибо мы не знаем в данный момент времени какое значение у него имеется: положительное или отрицательное. А так берем знак, генерируем число, присваиваем его с противоположным знаком.
    5) По поводу углов поворота у Юнити есть много различных вариантов и это проще все вычитать самому. Кто-то делает разные параметры X и Y и в результате достигается угол, кто-то использует transform.localRotation, кто-то метод transform.Rotate(). Есть вот даже пример:
    public class FollowPath: MonoBehaviour { public float speed; public float rotationSpeed; //transform Transform myTrans; //object position Vector3 myPos; //object rotation Vector3 myRot; //object rotation float angle; // Use this for initialization void Start() { myTrans = transform; myPos = myTrans.position; myRot = myTrans.rotation.eulerAngles; } // Update is called once per frame void FixedUpdate() { //converting the object euler angle's magnitude from to Radians angle = myTrans.eulerAngles.magnitude * Mathf.Deg2Rad; //rotate object Right & Left if (Input.GetKey(KeyCode.RightArrow)) { myRot.z -= rotationSpeed; } if (Input.GetKey(KeyCode.LeftArrow)) { myRot.z += rotationSpeed; } //move object Forward & Backward if (Input.GetKey(KeyCode.UpArrow)) { myPos.x += (Mathf.Cos(angle) * speed) * Time.deltaTime; myPos.y += (Mathf.Sin(angle) * speed) * Time.deltaTime; } if (Input.GetKey(KeyCode.DownArrow)) { myPos.x += Mathf.Cos(angle) * Time.deltaTime; myPos.y += Mathf.Sin(angle) * Time.deltaTime; } //Apply myTrans.position = myPos; myTrans.rotation = Quaternion.Euler(myRot); } }
    Где само движение построено на вычислении угла и подстановке в transform.position
    myPos.x += (Mathf.Cos (angle) * speed) * Time.deltaTime; myPos.y += (Mathf.Sin (angle) * speed) * Time.deltaTime;
    Для вашего примера можно попробовать что-то такое:
    private Vector2 dir; private Transform myTransform;
    public float speed; public float angle; public float vx = 1; public float vy = 1;
    void Start() { myTransform = transform; InvokeRepeating("Move", 0.05f, 0.05f);
    dir = Vector2.right;
    angle = Vector2.Angle(Vector2.right, new Vector2(vx, vy)); myTransform.localRotation = Quaternion.Euler(0, 0, angle); }
    void Move() { myTransform.Translate(dir * speed * Time.deltaTime); }
    void OnCollisionEnter2D(Collision2D coll) { if (coll.gameObject.name.StartsWith ("bright") || coll.gameObject.name.StartsWith("bleft")) { vx = -vx; }
    if (coll.gameObject.name.StartsWith ("btop") || coll.gameObject.name.StartsWith("bbottom")) { vy = -vy; }
    angle = Vector2.Angle(Vector2.right, new Vector2(vx, vy)); if (coll.gameObject.name.StartsWith ("bleft") && vy < 0 || coll.gameObject.name.StartsWith ("bright") && vy < 0 || coll.gameObject.name.StartsWith("btop")) { angle = -angle; }
    myTransform.localRotation = Quaternion.Euler(0, 0, angle); }

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