Страницы

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

понедельник, 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

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

Если создать домен и загрузить в него сборку, а потом используя метод GetAssemblies, достать сборки, то выгружая домен, сборка остается в основном домене приложения и с ней ничего сделать нельзя, удалить например.
Каким образом можно использовать методы сборки из чужого домена, при этом выгружая домен выгрузить и сборку из приложения?
Вот код которым я это делаю:
using System; using System.IO; using System.Reflection;
namespace Test { internal static class Program { private static void Main() { var appDomain = AppDomain.CreateDomain( "test" ); AssemblyLoader.Run(appDomain);
Console.WriteLine("Сборка загружена");
foreach ( var assembly in appDomain.GetAssemblies () ) { Console.WriteLine ( assembly.GetName () ); }
Console.ReadLine();
AppDomain.Unload( appDomain );
Console.WriteLine("Домен выгружен"); //Не удается удалить сборку из каталога, она не выгрузилась! Console.ReadLine(); } }
public static class AssemblyLoader { public static void Run( AppDomain appDomain ) { appDomain.DoCallBack( Invoke ); }
private static void Invoke() { Assembly.LoadFile( Path.Combine( Environment.CurrentDirectory, "test.dll" ) ); }
}
}


Ответ

Если вы передаёте объект из другого домена, вы этим самым загружаете его в ваш домен, чего вы как раз хотите избежать. Решением может быть передавать примитивные типы. Чтобы не ограничивать себя простыми колбеками, вам нужно воспользоваться MarshalByRefObject (они не копируются между доменами, а выполняются в том домене, где созданы).
Итак, вот рабочий код.
Это плагин, DomainsPlugin.dll:
namespace DomainsPlugin { public class Plugin { public IEnumerable GetNames() { return AppDomain.CurrentDomain.GetAssemblies().Select(asm => asm.GetName()); } } }
Ничего особого, просто рабочий метод.
Теперь главная программа:
namespace DomainsMain { class Program { static void Main(string[] args) { // в этом каталоге бежит программа var executableDir = Path.GetDirectoryName( Assembly.GetExecutingAssembly().Location);
// это каталог, где лежит плагин. // у вас он будет лежать, понятно, в другом месте var pluginDir = Path.GetFullPath(Path.Combine( executableDir, "..", "..", "..", "DomainsPlugin", "bin", "Debug"));
// оригинал плагина var pluginSourceFile = Path.Combine(pluginDir, "DomainsPlugin.dll"); // а сюда мы его скопируем, и отсюда будем загружать var pluginWorkingFile = Path.Combine(executableDir, "DomainsPlugin.dll");
// копируем File.Copy(pluginSourceFile, pluginWorkingFile, overwrite: true);
// окей, теперь новый домен var pluginDomain = AppDomain.CreateDomain("Plugin");
// теперь, создаём экземпляр нашего класса в новом домене // у нас на него реально лишь прокси-объект var resident = (Resident)pluginDomain.CreateInstanceAndUnwrap( Assembly.GetExecutingAssembly().FullName, "DomainsMain.Resident"); // получили данные resident.Obtain();
// выводим их foreach (var r in resident.Result) Console.WriteLine(r.ToString());
// выгружаем домен... AppDomain.Unload(pluginDomain);
// ... и удаляем плагин File.Delete(pluginWorkingFile); } }
// простой класс, будет выполняться в другом домене public class Resident : MarshalByRefObject { public List Result;
public void Obtain() { // загружаем библиотеку var asm = Assembly.LoadFrom("DomainsPlugin.dll"); var type = asm.GetType("DomainsPlugin.Plugin"); // и вызываем функцию из неё через рефлексию // можно было бы закастить к интерфейсу, если объявить его в // этой или другой общей dll-ке var p = Activator.CreateInstance(type); var method = type.GetMethod( "GetNames", BindingFlags.Instance | BindingFlags.Public); var result = (IEnumerable)method.Invoke(p, null); // сохраняем результат. это поле будет доступно из первоначального домена Result = result.ToList(); } } }
На моей машине из-под Visual Studio выдаёт:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Microsoft.VisualStudio.HostingProcess.Utilities, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a DomainsMain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 DomainsPlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

Обновление: резидентная функция (Obtain()) вполне может возвращать значение. Но это значение должно быть сериализируемым, чтобы «протиснуться» между доменами.
Для нашего примера, подправляем класс Resident
public class Resident : MarshalByRefObject { public List Obtain() // <-- поменяли возвращаемый тип { // и убрали свойство Result // загружаем библиотеку var asm = Assembly.LoadFrom("DomainsPlugin.dll"); var type = asm.GetType("DomainsPlugin.Plugin"); // и вызываем функцию из неё через рефлексию // можно было бы закастить к интерфейсу, если объявить его в // этой или другой общей dll-ке var p = Activator.CreateInstance(type); var method = type.GetMethod( "GetNames", BindingFlags.Instance | BindingFlags.Public); var result = (IEnumerable)method.Invoke(p, null); return result.ToList(); } }
Теперь вызов из основного кода выглядит так:
// получили данные var result = resident.Obtain();
// выводим их foreach (var r in result) Console.WriteLine(r.ToString());

JMP FF FF FF как будет

Здравствуйте.
JMP FF (JMP SHORT т.е. на один байт) байткод EB FF
JMP FF FF FF FF (JMP NEAR т.е. на четыре байт) байткод E9 FF FF FF FF
Такой вопрос, JMP на 3 байтный прыжок как будет?


Ответ

Надо использовать косвенный jmp near с 4х байтной адресацией, заполнив недостающие байты 0
JMP 002C314C

Rails не видит введенных в форме данных

У меня сразу несколько вопросов:
Добавил в Devise атрибуты name (string) и phone (integer). При отправке формы выдает ошибки "Name can't be blank" и "Phone can't be blank", хотя поля заполнены. Как заменить лэйблы (например, перевести на русский)? Когда меняю :name на :ФИО - все нормально, но когда меняю остальные - выдает ошибку.
Сама форма:
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :role => 'form'}) do |f| %>

Регистрация

<%= devise_error_messages! %>
<%= f.label :name %>
<%= f.text_field :name, autofocus: true %>
<%= f.label :email %>
<%= f.email_field :email %>
<%= f.label :phone %>
<%= f.text_field :phone %>
<%= f.label :password %> <%= f.password_field :password, class: 'form-control' %>
<%= f.label :password_confirmation %> <%= f.password_field :password_confirmation, class: 'form-control' %>
<%= f.submit 'Sign up', :class => 'button right' %> <% end %>


Ответ

Добавил в Devise атрибуты name (string) и phone (integer). При отправке формы выдает ошибки "Name can't be blank" и "Phone can't be blank", хотя поля заполнены.
Скорее всего, вы наступили на те же грабли, что и я когда-то, забыв про Strong Parameters.
Как заменить лэйблы (например перевести на русский)? Когда меняю :name на :ФИО - все нормально, но когда меняю остальные - выдает ошибку.
Разумеется, выдаёт. Надо 'ФИО', а не :ФИО и так далее. С двоеточия начинаются ключи, а вам надо задать конкретное строковое значение. Однако, если вы собираетесь именно переводить, то лучше сразу начинать использовать API интернационализации

Где находится указатель контекста переменных thread local?

В коде имеются несколько переменных типа static __thread. Если ядро переключает контекст потока, то проблем не наблюдается. Если самостоятельно переключить контекст потока 1, на поток 2, то поток 2 будет видеть локальные переменные потока 1, что меня совсем не устраивает.
К сожалению, я не обнаружил стандартных средств быстро переключаться между потоками, а механизмы сопрограмм ничего не знают про переменные __thread
Отсюда вопрос, можно ли и как переключать контекст переменных типа __thread?
PS: Если что-то не понятно, спрашивайте, уточню. Вопросы типа: зачем/почему - игнорируются, кому кто не нравится - отвечать не заставляю.


Ответ

Вот тут, кажется, все подробно расписано: https://www.akkadia.org/drepper/tls.pdf
Вкратце: на архитектуре x86-64 переменные TLS хранятся в сегменте FS. При этом там есть определенная структура данных, которая позволяет, в том числе, получить адреса этих же переменных в сегменте DS (чтобы можно было получить на них указатель). Заголовок этой структуры хранится по адресу FS:0.
Дальше разбирайтесь сами :)
PS а в Windows для x64 эта структура находится по адресу GS:0

SwipeRefreshLayout обновление снизу

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


Ответ

SwipeRefreshLayout не поддерживает pull-to-refresh снизу, но на github-e есть решение, которое Вам подойдет. Ссылка

Почему присваивание значения readonly свойству не вызывает ошибки?

В JavaScript можно определить свойство, доступное только для чтения (readonly). Однако, если я пытаюсь переопределить значение такого свойства, то ничего не происходит. Значение остается прежним, но и исключение не выбрасывается.
Пример кода:
var obj = {}; Object.defineProperty(obj, 'val', { writable: false, value: 'foo' });
obj.val = 'bar'; console.log(obj.val); // Выведет 'foo';
Почему так происходит, и как сделать так, чтобы подобные ошибки не замалчивались?


Ответ

Возможность определять свойства, доступные только для чтения появилась относительно недавно, в ES5. Поэтому, в целях обратной совместимости со старым кодом, JavaScript специально замалчивает подобные ошибки.
Если вы хотите, чтобы подобные ошибки не замалчивались, используйте строгий режим
(function() { 'use strict';
var obj = {}; Object.defineProperty(obj, 'val', { writable: false, value: 'foo' });
obj.val = 'bar'; // [TypeError]: "val" is read-only console.log(obj.val); })();
Более подробно, поведение оператора присваивания описано в спецификации ECMAScript. Помимо прочего, в блоке "Note" сказано, что исключение должно выбрасываться только в строгом режиме.
When an assignment occurs within strict mode code <...> the LeftHandSide may not be a reference to a data property with the attribute value {[[Writable]]:false}, to an accessor property with the attribute value {[[Set]]:undefined}, nor to a non-existent property of an object for which the IsExtensible predicate returns the value false. In these cases a TypeError exception is thrown.

Подчеркивание последней строчки

Добрый день,
Есть заголовки,которые обычно в 2 строчки, у данных заголовков нужно подчеркнуть именно нижнею строчку.

Строка в две строчки


Допустим в данном варианте, "две строчки" переносится и эти слова надо подчеркнуть.
Естественно вариант, брать нижнею строчку в доп тег, не подходит, т.к это все выводится автоматически через двиг и верстка адаптивная.

Строка в две строчки


Пока в голову пришел только такой "костыль", подчеркивать через бордер тег a, делать нужный line-height, и с помощью :before, закрывать первое подчеркивание. Данный вариант работает, но проблема именно в line-height и большом отступе между строчками, чтобы закрыть первый бордер. p.s строка выравнивается по центру! Надеюсь не сильно намудрил;)


Ответ

https://jsfiddle.net/LL895spd/3/
h3 { width: 100px; text-align: center; display: inline-block; position: relative; }
h3 a:before { content:''; position:absolute; width:100%; height:100%; left:0; top:-1px; background:#fff; }
h3 a span{ position:relative; }
a { border-bottom: 1px dashed #000; text-decoration: none; }
Ура!) Получилось сделать, без дубликатов и т.д) Как я раньше до такого решения не допер) Спасибо всем!) ihhaman - спасибо тебе! Натолкнул меня на мысль данную)

Как сделать три уровня кавычек в bash?

Добрый день, коллеги! Как отредактировать следующую строку для её корректного исполнения?
$ su postgres -c 'psql -c "alter role postgres with password 'postgres';"'
Проблема, собственно, в средних кавычках (password 'postgres') Скрипт выполняется от имени root.
p.s. есть обходной вариант - пометить строку psql -c "alter role postgres with password 'postgres';" в ещё один sh-скрипт, и уже его выполнять через su user -c, но я не считаю это правильным.


Ответ

Попробуйте так:
# su postgres -c 'psql -c "alter role postgres with password '"'"'postgres'"'"';"'

Режем строку, сохраняя разделители

Как можно строку формата: "-99/9" разбить на массив подстрок {"-","99","/","9"}?


Ответ

Зачем усложнять? Есть числа и что-то между ними. Выделяем числа с двух сторон пробелами, нормализуем строку, чтобы после разбиения не появилось пустых элементов и готово.
import java.util.Arrays;
public class Main {
public static void main(String[] args) { String str = "2+2*24-78"; str = str.replaceAll("(\\d+)"," $1 "); str = str.trim(); String[] stack = str.split(" "); System.out.println(Arrays.toString(stack)); } }
В вопросе ничего не говорилось про десятичный разделитель, функции и скобки.
Правильным подходом по решению задачи это не сразу разбивать строку на отдельные лексемы, а считывая ее последовательно обрабатывать конечным автоматом. За основу можно взять алгоритм из статьи про обратную польскую нотацию