Страницы

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

понедельник, 6 мая 2019 г.

Ubuntu: звук + щелчок внутри ноутбука

Периодически мой ноутбук издаёт странные, на мой взгляд, звуки.
Это началось после того, как я перешёл на Ubuntu (на Windows такого не замечал) ...

Иногда внутри ноутбука возникает такой сигнал:
пи-и-и-к → щелчок (как-будто что-то переключилось)
Раньше замечал и немного иные сигналы:
пару раз пи-и-и-к в разных тональностях, а затем щелчок
Также щелчок воспроизводится при выключении компьютера.

Что это может быть: то ли опасаться, то ли нет; — не знаю?

Ноутбук: Samsung NP-RV513-A02UA Жёсткий диск: SAMSUNG HM321HI (2AJ10002)


Ответ

В общем, вот что мне ответили в Samsung:
Такие звуки и щелчок связаны именно с жестким диском. Причина, скорее всего, в том, что Linux не имеет поддержки со стороны Биоса ноутбука и контроллера жестких дисков и поэтому его команды неправильно отрабатываются и щелчок это звук парковки головок не в штатном режиме. Это не очень хорошо и может привести к ускоренному износу механики жесткого диска. Рекомендуем произвести возврат на предустановленную версию операционной системы.
Начав гуглить по запросу linux samsung hdd bios, нарвался на следующую статью:
Problem with hard drive clicking
Там очень много информации по hard drive clicking — нужно пробовать; ну и гуглить, если ничего не подойдёт, эту же фразу — информации также достаточно. Однако первым делом в любом случае нужно отловить логи при этом кликаньи, а там уже будет всё понятно, надеюсь.

Подсчет строк в строке. SQL

Определить какие экзамены были в месяце Х (Например, в Июне) Не знал как реализовать голова дошла до следующего:
SELECT COUNT(*)// Если правильно понял то звездочка перехватывает все имеющиеся значения. FROM Exam_st// Это таблица экзаменов WHERE Date = '2015.06.%' // Date (это столбец в котором указаны даты)
Прошу подскажите как исправить следующую ошибку?
Сообщение 241, уровень 16, состояние 1, строка 1 Ошибка преобразования даты или времени из символьной строки.


Ответ

WHERE DATE(Date) BETWEEN '2015-06-01' AND '2015-06-31'

Почему strtotime() и time() дают разное время?

Сразу приведу пример кода:
$time1 = strtotime('+1 week'); $time2 = time() + 3600*24*7;
var_dump($time1); var_dump($time2);
echo PHP_EOL;
var_dump(date('Y-m-d H:i:s', $time1)); var_dump(date('Y-m-d H:i:s', $time2));
Вот полученные результаты:
int(1459164441) int(1459168041)
string(19) "2016-03-28 12:27:21" string(19) "2016-03-28 13:27:21"
Т.е. разница ровно час.
Случайно наткнулся, проверял чего тест стал падать, там дата проверялась.
Интересно, что вчера и позавчера, неделю и месяц назад возвращаемое время было абсолютно одинаковым!
UPD: Временная зона установлена "Europe/London".


Ответ

В ночь с субботы на воскресенье 27 марта часы переводятся на час назад. Временная зона была установлена "Europe/London".
Т.к. сегодня стукнуло 21 марта, то через неделю уже будет 28 марта. И соответственно время strtotime('+1 week') уже выдаёт результат с учётом перевода времени на час назад.
У нас в Беларуси уже отменили перевод на летнее/зимнее время. В России тоже. На временной зоне "Europe/Minsk" и "Europe/Moscow" возвращаемое время одинаковое в обоих случаях.
$time1 = strtotime('+1 week'); $time2 = time() + 3600*24*7;
В общем, проблема различий во времени связана с переводом времени на час для указанной временной зоны "Europe/London".
Функция strtotime учитывает часовой пояс, а time - нет, возвращает unix-timestamp.

Использование интерфейсов

Есть классы: Животное, Кот и Собака с интерфейсом дрессируемый.
public class Animal public class Cat extends Animal public class Dog extends Animal implements Training public interface Training { void jump(); }
Нужно написать функцию, которая получает животное, проверяет дрессируемое ли оно и если да, то выполняет команду. Что-то вроде:
public void Test(Animal animal) { if(animal instanceof Training) { animal.jump(); } }
Как это правильно сделать?


Ответ

Почти правильно, только { animal.jump(); } компилятор не пропустит, потому что animal имеет тип Animal, у которого нет метода jump(). В Java наличие полей и методов проверяется по типу ссылки, а не объекта, на который она указывает. Поэтому нужно выполнить приведение ссылки к типу Training одним из двух нижеследующих способов:
((Training)animal).jump();
Training trainingAnimal = (Training)animal; trainingAnimal.jump();

Исключение при вызове метода MoveTo у экземпляра DirectoryInfo


DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory()); string s = @"C:\"; dir.MoveTo(s);
Текст в s для примера. Какой бы путь не вставил, исключение всё равно вылетает.
Исключение:
"Процесс не может получить доступ к файлу, так как этот файл занят другим процессом."
Что не так? Вроде простейший код.

UPD 24.03.16. 17.45.
Если кому-нибудь надо, могу выложить алгоритм поиска вверх по папкам. Ищет в текущей папке нужную папку/файл/файлы с заданным расширением. Если не найдено, поднимается на уровень выше и ищет там, ещё выше и т. д. Опционально - поиск в подпапках, максимальное количество уровней "подъёма" вверх, название искомой директории, маска поиска файлов (одного файла или файлов с заданным расширением), папка начала поиска. На выходе - путь к найденной папке. Поиск ленивый - до первой найденной папки, в которой есть искомые файлы.


Ответ

Из текущей папки запущенно приложение, вот и не удается переместить её.
По крайней мере - это то что приходит в голову в первую очередь.

Не работает onAttach

Я создал ListFragment (знаю, что есть RecyclerView, просто книгу читаю). В методе onAttach я пытаюсь получить ссылку на активность, чтобы вызывать ее метод. После первого запуска — мое приложение не работало. После 10ти минут раздумий я нашел ошибку! onAttach(Context context) не вызывается, а onAttach(Activity activity) (deprecated) — вызывается! Вот методы:
@Override //РАБОТАЕТ public void onAttach(Activity activity) { super.onAttach(activity); listener = (WorkoutListListener) activity; }
@Override //НЕ РАБОТАЕТ public void onAttach(Context context) { super.onAttach(context); listener = (WorkoutListListener) context; }
Так в чем же разница этих двух методов? Почему устаревший работает, а обычный нет?


Ответ

Подробно на англо-саксонсом тут
Кратко:
ListFragment есть только в пакете android.app и добавляется в активити через FragmentManager вместо SupportFragmentManager. Из-за этого не используется метод onAttach(Context context) на устройствах с API<23, а используется onAttach(Activity activity)
Решением может быть помечание обоих методов соответствующими аннотациями для вызова нужной версии на определённых уровнях API и делегирование продолжения логики в общий для всех API собственный метод, в коем вы уже можете кастовать контекст к активити (помня, что класс итоговой активити разнится в зависимости от уровня API (решение - кастовать к интерфейсу, реализуемому активити):
/* * onAttach(Context) не вызовется до API 23 версии вместо этого будет вызван onAttach(Activity), коий устарел с 23 API * Так что вызовем onAttachToContext */ @TargetApi(23) @Override public void onAttach(Context context) { super.onAttach(context); onAttachToContext(context); }
/* * устарел с 23 API * Так что вызовем onAttachToContext */ @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) { super.onAttach(activity); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { onAttachToContext(activity); } }
/* * Вызовется в момент присоединения фрагмента к активити */ protected void onAttachToContext(Context context) { //здесь всегда есть контекст и метод всегда вызовется. //тут можно кастовать контест к активити. //но лучше к реализуемому ею интерфейсу //чтоб не проверять из какого пакета активити в каждом из случаев }

Обрезать получаемый реультат в PostrgeSQL

Нужно вытащить данные с БД так чтобы они были уникальными и обрезать их. Обрезать нужно все после останнего символа в строке - '_' (обрезать включая символ '_'). То есть если у нас в поле name имеются значения - 'Tom_1', 'Tom_2', 'Tom_Rob_3' должно вывести - "Tom", "Tom_Rob"
SELECT DISTINCT ON (name) FROM user
Как это сделать?


Ответ

SELECT DISTINCT ON(name_trimmed) LEFT(name, length(name) - position('_' in reverse(name))) AS name_trimmed FROM "user"
Пример в SQL Fiddle