Страницы

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

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

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

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


Ответ

например, можно воспользоваться программой 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); }

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

Как во фрагменте проверить изменилось ли значение SharedPreferences

Хочу, чтобы фрагмент, например, каждые 2 секунды сверял значение из SharedPreferences и выполнял определенное действие или как можно по другому реализовать ?


Ответ

Чтобы контролировать изменения в SharedPreferences на него можно повесить слушатель. Слушатель будет срабатывать каждый раз, когда в экземпляр настроек, к которым он подключен будут вносится любые изменения:
public class SomeFragment extends Fragment implements SharedPreferences.OnSharedPreferenceChangeListener {
SharedPreferences prefs;
....
prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); prefs.registerOnSharedPreferenceChangeListener(this);
@Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("some_key")) {
// действия при изменении значения в ключе some_key
} } }
где some_key - определенный ключ в настройках (ячейка для сохранения значений) sharedPreferences - экземпляр настроек. Из него можно получить конкретное измененное значение.
параметр переданный колбэком String key это тот ключ, в котором произошли изменения.
Официальная документация по вопросу и рекомендации по использованию.

Как удалить ненужные символы в шрифте формата TTF?

Как удалить ненужные символы в шрифте формата TTF?
У меня есть шрифт, там много ненужных для меня символов. Могу ли я как-то удалить их отуда?


Ответ

Скачиваем бесплатную программу FontForge.

Запускаем ее и выбираем нужный шрифт.


С зажатым Shift мышью выбираем нужные символы.


Инвертируем выделение: Правка→Выделить→Инвертировать выделение


Удаляем ненужные символы: Кодировка→Отцепить и удалить символы...


Вместо символов должны появиться зачеркнутые квадраты:


Сохраняем шрифт.

Основано на ответе к вопросу: "how to remove characters from a font file?"