Страницы

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

четверг, 6 июня 2019 г.

Ковариантность возвращаемых типов

В книге Thinking in Java (Bruce Eckel) есть такой код: Собственно интересует место с комментарием //Covariant return. Откуда тут ковариантность вообще? //: interfaces/interfaceprocessor/Processor.java package interfaces.interfaceprocessor;
public interface Processor { String name(); Object process(Object input); } ///:~
//: interfaces/interfaceprocessor/Apply.java package interfaces.interfaceprocessor; import static net.mindview.util.Print.*;
public class Apply { public static void process(Processor p, Object s) { print("Using Processor " + p.name()); print(p.process(s)); } } ///:~
//: interfaces/interfaceprocessor/StringProcessor.java package interfaces.interfaceprocessor; import java.util.*;
public abstract class StringProcessor implements Processor{ public String name() { return getClass().getSimpleName(); } public abstract String process(Object input); public static String s = "If she weighs the same as a duck, she’s made of wood"; public static void main(String[] args) { Apply.process(new Upcase(), s); Apply.process(new Downcase(), s); Apply.process(new Splitter(), s); } }
class Upcase extends StringProcessor { public String process(Object input) { **// Covariant return** return ((String)input).toUpperCase(); } }
class Downcase extends StringProcessor { public String process(Object input) { return ((String)input).toLowerCase(); } }
class Splitter extends StringProcessor { public String process(Object input) { return Arrays.toString(((String)input).split(" ")); } }


Ответ

Идея очень простая: вы имплементируете метод Object process(Object input) интерфейса Processor методом String process(Object input) Где на самом деле находится метод — в абстрактном классе StringProcessor или в его реализации Upcase — в принципе не так важно, и является скорее теоретическим вопросом. Главное тут то, что тип возвращаемого значения является подтипом требуемого интерфейсом типа.

Задать определенное время в AlarmManager

Возникла проблема при вызове Notification в определенное время суток. Notification вызываю при помощи AlarmManager. Когда задаю текущее время (System.currentTimeMillis()), проблем не возникает, все отлично запускается и выводится, но как только пытаюсь задать определенное, то бишь, точное время, ничего не происходит. Что подскажете? Как правильно задать время?
Рабочий вариант:
private void restartNotify(Context context) { alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent notifyIntent = new Intent(context, NotificationMessage.class); contentIntent = PendingIntent.getBroadcast(this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT ); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), contentIntent); }
Не рабочий:
private void restartNotify(Context context) { alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent notifyIntent = new Intent(context, NotificationMessage.class); contentIntent = PendingIntent.getBroadcast(this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT );
Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR, 15); calendar.set(Calendar.MINUTE, 20); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), contentIntent); }
Решил проблему. Вот реализация:
private void restartNotify(Context context) { alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent notifyIntent = new Intent(context, NotificationMessage.class); contentIntent = PendingIntent.getBroadcast(this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT );
Calendar calendar = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
calendar.set(Calendar.YEAR, cal.get(Calendar.YEAR)); calendar.set(Calendar.MONTH, cal.get(Calendar.MONTH)); calendar.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)); calendar.set(Calendar.HOUR_OF_DAY, 13); calendar.set(Calendar.MINUTE, 53); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), contentIntent); }
Прошу обратить внимание, кому интересно, что бы все заработало, нужно задать все пункты (год, месяц, день, часы, минуты, секунды, миллисекунды). Важный пункт calendar.set(Calendar.HOUR OF DAY, 13);. Если указать Calendar.HOUR вместо Calendar.HOUR OF DAY то время вместо 24-х часового формата, будет использовать 12-ти часовой, из-за чего время будет считаться указанным не верно (Если у вас на телефоне 24-х часовой формат)


Ответ

А можете проверить какое именно время вы получаете в calendar.getTimeInMillis()? И попробуйте вместо обычного использовать григорианский календарь Calendar calendar = new GregorianCalendar()

Как разбить большой .sql-файл на несколько маленьких?

Есть .sql-файл (68 GB, 1 таблица). Нужно как-то его расчленить на несколько файлов, чтобы запихать в БД. Ничто его не открывает. SQLDumpSplitter его не делит. Как быть?


Ответ

Вариант1: mysql -h localhost -u user -p mydatabase < cat mybigfile.sql ? Вариант2: заходим в консоль mysql (mysql -u user -p) USE yourdatabase; SOURCE /path/to/the/sql/dump/mybigfile.sql; Дополнение к варианту2 со StackOverflow: mysql -u root -p set global net_buffer_length=1000000; --Set network buffer length to a large byte number set global max_allowed_packet=1000000000; --Set maximum allowed packet size to a large byte number SET foreign_key_checks = 0; --Disable foreign key checking to avoid delays,errors and unwanted behaviour source file.sql --Import your sql dump file SET foreign_key_checks = 1; --Remember to enable foreign key checks when procedure is complete! ps; если бы написали с какими ошибками вылетает было бы намного проще предложить workaround :)

Центрирование изображения в блоке меньшего размера.

Имеется div заданной высоты, ширина у div в процентах. В div вставлено изображение. При разрешении экрана более 1024 изображение центрируется. При разрешении равном или менее 1024 оно обрезается с одного края, т.к. ширина блока становится меньше ширины изображения. Как можно в таком случае горизонтально центрировать изображение средствами js и обрезать его с обоих боков? Вариант с изменением размеров изображения не подходит, т.к. по высоте div фиксирован и изображение должно занимать его полностью. HTML:

CSS: .box { width: 21%; height: 70px; background: #222; float: left; text-align: center; margin: 20px 2%; overflow: hidden; }


Ответ

@x01x, на моё предложение в комментарии, вы не отреагировали. Значит, могу предложить такой вариант решения вашей задачи. Только учтите, что решение не очень кроссбраузерное .box { position: relative; display: inline-block; width: 21%; height: 70px; margin: 5px; text-align: center; border: 1px solid #999; overflow: hidden; } .box img{ position: absolute; -webkit-transform: translateX(-50%); -moz-transform: translateX(-50%); -ms-transform: translateX(-50%); transform: translateX(-50%); } UPD Вариант с JS var box = $('.box'), img = $('img', box), imgW = img.width(); $(window).resize(function(){ img.css({ marginLeft: (box.width() - imgW) / 2 }); }).resize();

Django сохранение изображения из формы

Подскажите как сохранить на сервер изображение, указанное в форме.
С формы информацию в бд сохраняю, считывая get или post запрос. Т.е. получается что я должен принять путь к изображению, но вот как его сохранить?

То есть чтобы загрузить изображение, можно при обработке страницы, куда приходят данные, делать так?
caption = request.POST['caption'] preDescription = request.POST['preDescription'] description = request.POST['description'] image = request.POST['image']
Потом уже использовать вот это?
image = models.ImageField(upload_to='news')

Сделал:
models.py
from django.db import models
class News(models.Model):
caption = models.CharField(max_length=30) preDescription = models.CharField(max_length=100) description = models.CharField(max_length=300) image = models.ImageField(upload_to='news')
forms.py
from django import forms from anime.models import *
class NewsForm(forms.Form):
class Meta: model = News
views.py
def addnews_status(request):
a = NewsForm(request.POST) a.save()
Пишет вот что - 'NewsForm' object has no attribute 'save'.
Ошибку я перевести могу, но я не понимаю почему его нет? Делал всё как положено. Я хотя бы на верном пути?


Ответ

С формы информацию в бд сохраняю, считывая get или post запрос. Неправильно делаете. Почитайте про ModelForms, там все работает абсолютно автоматически.

Распарсить json

Добрый вечер. Так как я не очень силен в php однако пишу сейчас vk-api приложение, хотелось бы узнать следующее: как в PHP можно распарсить json? Знаю что через json_decode, но как именно не знаю. Хотелось бы записать строчку id в переменную. Сам JSON: response: [{ id: 123456, first_name: 'First', last_name: 'Name' }]


Ответ

$responseJson = "[{ id: 123456, first_name: 'First', last_name: 'Name' }]"; // ваш пример строки $response = json_decode($responseJson, true); // преобразование строки в формате json в ассоциативный массив $id = $response[0]['id']; // ваш искомый id Документация: JSON json_encode() json_decode() работа с массивами

Одновременная работа и обновление ListView

Доброго времени суток, форумчане! Создаю мобильное приложение в Android Studio. столкнулся с такой проблемой: Принцип работы активности: Отправляется POST запрос на сервер Получаем обратно информацию в JSON формате Обновляем полностью ListView Нужно следующее: Если я прокручиваю список ListView и останавливаюсь на середине списка, то при автоматическом обновлении ListView, я так же должен остаться на середине списка. Реализовано: //создаем адаптер и отправляем ему ArrayList(groups, locations) а так же context(PZakazi.this) ExpListAdapter adapter = new ExpListAdapter(getApplicationContext(), groups, locations, PZakazi.this); adapter.notifyDataSetChanged();
//отключаем видимый Scroll listView.setScrollContainer(false);
//сохраняем положение ListView Parcelable state = listView.onSaveInstanceState();
//обновляем ListView listView.setAdapter(adapter);
//Восстанавливаем положение ListView listView.onRestoreInstanceState(state); Все работает замечательно! но есть НО! Когда происходит ошибка? Если запустить данную активность, и начать шевелить пальцем ListView туда<->сюда, быстро то выбивает следующую ошибку: Ошибка: FATAL EXCEPTION: main java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131230815, class android.widget.ExpandableListView) with Adapter(class android.widget.ExpandableListConnector)] Я приблизительно(на 80%) понимаю из-за чего это происходит, но не понимаю как именно исправить это.. Альтернатива: Или возможно есть альтернативный способ обновить ListView, сохранив его позицию? Очень нужна ваша помощь!


Ответ

@Fabien Вы создаете адаптер, потом notifyDataSetChanged, а потом устанавливаете этот адаптер ListView. Декларативно оно все верно, но вот только notifyDataSetChanged должен быть в самом конце. Данная ошибка возникает почти всегда, если кол-во элементов адаптера изменилось (по отношению к ListView. А присвоить адаптер, это почти всегда поменять кол-во элементов), а notifyDataSetChanged не был отправлен до того момента, когда ListView решил обновиться.