Страницы

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

суббота, 29 декабря 2018 г.

Чтение\Запись части байт из части файла

Имеем: обычный mp3 файл. Можно ли считать определенное количество байт, например 128 с конца файла, не читая весь поток байт? Можно ли перезаписать в конец файла эти 128 байт, не перезаписывая файл целиком? Можно ли удалить с конца файла 128 байт?
Если да, то как? Это нужно, т.к. хочу написать утилиту для редактирования ID3 тегов. И файлов будет очень много.
Я верно предположил, что если полностью читать-менять-записывать каждый файл, это будет занимать больше времени, чем менять куски данных в файлах?


Ответ

Если вы хотите теги редактировать, то я бы порекомендовал не писать велосипед, а использовать mp3agic, чтоб не мучиться с id3v2, id3v1 и т.п.

Можно ли спрятать JavaFX приложение в трей?

Эти 3 вопроса взаимосвязаны с вопросом о реализации одного проекта, но были распилены. Перед вами третий.
Второй, первый.
Есть GUI интерфейс который как запускается, так и выключается. И есть две операции, которые периодически выполняются. Причем одна маловесна, вторая до жути прожорлива.
Можно ли настроить окно JavaFX так, чтобы оно скрывалось в трей при нажатии крестика. (Не сворачивалось а именно в трей уходило)?


Ответ

Пример использования трея AWT + JavaFX:
https://gist.github.com/jewelsea/e231e89e8d36ef4e5d8a
import javafx.application.*; import javafx.geometry.Pos; import javafx.scene.*; import javafx.scene.control.Label; import javafx.scene.layout.*; import javafx.scene.paint.Color; import javafx.stage.*;
import javax.imageio.ImageIO; import java.io.IOException; import java.net.URL; import java.text.*; import java.util.*;
// Java 8 code public class JavaFXTrayIconSample extends Application {
// one icon location is shared between the application tray icon and task bar icon. // you could also use multiple icons to allow for clean display of tray icons on hi-dpi devices. private static final String iconImageLoc = "http://icons.iconarchive.com/icons/scafer31000/bubble-circle-3/16/GameCenter-icon.png";
// application stage is stored so that it can be shown and hidden based on system tray icon operations. private Stage stage;
// a timer allowing the tray icon to provide a periodic notification event. private Timer notificationTimer = new Timer();
// format used to display the current time in a tray icon notification. private DateFormat timeFormat = SimpleDateFormat.getTimeInstance();
// sets up the javafx application. // a tray icon is setup for the icon, but the main stage remains invisible until the user // interacts with the tray icon. @Override public void start(final Stage stage) { // stores a reference to the stage. this.stage = stage;
// instructs the javafx system not to exit implicitly when the last application window is shut. Platform.setImplicitExit(false);
// sets up the tray icon (using awt code run on the swing thread). javax.swing.SwingUtilities.invokeLater(this::addAppToTray);
// out stage will be translucent, so give it a transparent style. stage.initStyle(StageStyle.TRANSPARENT);
// create the layout for the javafx stage. StackPane layout = new StackPane(createContent()); layout.setStyle( "-fx-background-color: rgba(255, 255, 255, 0.5);" ); layout.setPrefSize(300, 200);
// this dummy app just hides itself when the app screen is clicked. // a real app might have some interactive UI and a separate icon which hides the app window. layout.setOnMouseClicked(event -> stage.hide());
// a scene with a transparent fill is necessary to implement the translucent app window. Scene scene = new Scene(layout); scene.setFill(Color.TRANSPARENT);
stage.setScene(scene); }
/** * For this dummy app, the (JavaFX scenegraph) content, just says "hello, world". * A real app, might load an FXML or something like that. * * @return the main window application content. */ private Node createContent() { Label hello = new Label("hello, world"); hello.setStyle("-fx-font-size: 40px; -fx-text-fill: forestgreen;"); Label instructions = new Label("(click to hide)"); instructions.setStyle("-fx-font-size: 12px; -fx-text-fill: orange;");
VBox content = new VBox(10, hello, instructions); content.setAlignment(Pos.CENTER);
return content; }
/** * Sets up a system tray icon for the application. */ private void addAppToTray() { try { // ensure awt toolkit is initialized. java.awt.Toolkit.getDefaultToolkit();
// app requires system tray support, just exit if there is no support. if (!java.awt.SystemTray.isSupported()) { System.out.println("No system tray support, application exiting."); Platform.exit(); }
// set up a system tray icon. java.awt.SystemTray tray = java.awt.SystemTray.getSystemTray(); URL imageLoc = new URL( iconImageLoc ); java.awt.Image image = ImageIO.read(imageLoc); java.awt.TrayIcon trayIcon = new java.awt.TrayIcon(image);
// if the user double-clicks on the tray icon, show the main app stage. trayIcon.addActionListener(event -> Platform.runLater(this::showStage));
// if the user selects the default menu item (which includes the app name), // show the main app stage. java.awt.MenuItem openItem = new java.awt.MenuItem("hello, world"); openItem.addActionListener(event -> Platform.runLater(this::showStage));
// the convention for tray icons seems to be to set the default icon for opening // the application stage in a bold font. java.awt.Font defaultFont = java.awt.Font.decode(null); java.awt.Font boldFont = defaultFont.deriveFont(java.awt.Font.BOLD); openItem.setFont(boldFont);
// to really exit the application, the user must go to the system tray icon // and select the exit option, this will shutdown JavaFX and remove the // tray icon (removing the tray icon will also shut down AWT). java.awt.MenuItem exitItem = new java.awt.MenuItem("Exit"); exitItem.addActionListener(event -> { notificationTimer.cancel(); Platform.exit(); tray.remove(trayIcon); });
// setup the popup menu for the application. final java.awt.PopupMenu popup = new java.awt.PopupMenu(); popup.add(openItem); popup.addSeparator(); popup.add(exitItem); trayIcon.setPopupMenu(popup);
// create a timer which periodically displays a notification message. notificationTimer.schedule( new TimerTask() { @Override public void run() { javax.swing.SwingUtilities.invokeLater(() -> trayIcon.displayMessage( "hello", "The time is now " + timeFormat.format(new Date()), java.awt.TrayIcon.MessageType.INFO ) ); } }, 5_000, 60_000 );
// add the application tray icon to the system tray. tray.add(trayIcon); } catch (java.awt.AWTException | IOException e) { System.out.println("Unable to init system tray"); e.printStackTrace(); } }
/** * Shows the application stage and ensures that it is brought ot the front of all stages. */ private void showStage() { if (stage != null) { stage.show(); stage.toFront(); } }
public static void main(String[] args) throws IOException, java.awt.AWTException { // Just launches the JavaFX application. // Due to way the application is coded, the application will remain running // until the user selects the Exit menu option from the tray icon. launch(args); } }
Объяснение почему awt:
https://toster.ru/q/221896
1. Есть ль альтернатива AWT-шным средствам работы с треем в Java 8? Да. Через пень-колоду-нативные методы (обращающиеся к вызовам ОС). Как, я понял, копать нужно в сторону SWT и иже с ними. Да так что проще заюзать AWT (для моей задачи). 2. Можно ли средствами JavaFX 8 работать с треем не прибегая к AWT/SWING? Нет. JavaFX 8 не поддерживает работу с треем. Возможно, поддержка работы с треем будет добавлена в 9й версии.
Ссылка на stackoverflow.com по данному вопросу:
https://stackoverflow.com/questions/12571329/javafx-app-in-system-tray

Определить, находится ли точка в области

Есть ряд точек на плоскости и есть область (например круг). Нужно определить, какие точки входят в область.
Решение есть. Но оно подразумевает проверку каждой точки на вхождение в область. Натыкал я по рандому в редакторе 100000 точек. Нарисовал кружок. И вот я точно вижу, какие точки входят в область. Я даже не знаю про существование остальных, потому что область рисования огромна. А компьютер же будет перебирать все 100000 точек. А если их миллион? А миллиард? В итоге время вычисления прямо пропорционально количеству точек, тогда как человек с его тормознутостью даст ответ сразу. :)
Вот и подумалось мне, а как бы облегчить задачу программе? На ИИ я не претендую, но разобравшись в вопросе, можно топорно научить компьютер решать такую задачу. Нужно только понять, как это делает человек. На что обращает внимание. Какими величинами оперирует. Уж точно не координатами :)
Еще пример. Я выбираю точку и мне нужно найти ближайшую к ней. Не хочется перебирать все множество точек для этого.
UPD:
Есть вариант разбить всю область на подобласти с заданной детализацией. Каждую область хранить в памяти как отдельный объект и добавляя точки в основную область, добавлять их так же в подобласти (квадрат А2). Далее вычислять, какие подобласти пересекаются с поверяемой областью и проверять на вхождение в проверяемую область уже не всех точек, а лишь тех, которые содержатся в подобластях. В этом случае скорость поиска будет быстрее лишь в тех случаях, когда количество точек значительно выше количества областей. Количество областей зависит от детализации. Детализация будет зависеть от конкретной задачи (было бы не очень хорошо, если бы размер подобласти приближался к размеру проверяемой области).


Ответ

Несколько (не)очевидных моментов:
на картинке – все точки уже отсортированы самим своим расположением. Когда двигается «окно», осуществляется выборка узкого диапазона значений. В базе данных – длинный список безликих координат. на картинке точки имеют ненулевую площадь, т.е. можно говорить об округлении их координат до какой-то области.
Т.о. для быстрого решения, сравнимого со зрением нужно:
отсортировать координаты и построить индексы по X и Y, а может, и деревья для каждой точки - расстояния до соседних, или только список ближайших. На бумаге это делается в момент расстановки точек. округлять, или, вернее, «оквадрачивать» : ) – значения координат точек квантизировать до довольно крупной сетки. Форму окна - тоже - до угловатого подобия окружности, проходящего всегда между узлами координатной сетки.
Тогда задача приблизится по условиям к «естественному» зрению и станет заметно быстрее.

Если дельше приближаться к зрению, которое, в какой-то степени, нечёткое, для ч/б картинки задачу можно решить графически, не заморачиваясь распознаванием объектов. Допустим, белый фон и чёрные точки. Считаем, что примерно известны средняя площадь каждой черной точки и площадь окна. Размыть полностью картинку (Blur-Average в Photoshop). Получится оттенок серого. Из пропорции серый : черный = N_точек : (площадь фигуры : площадь точки) получаем примерное число точек.

В чем разница папок res/values и res/values-v11

Чем отличается файл styles.xml в папке values, от файла styles.xml в папке values-v11?
И что из них использует Android Studio?


Ответ

Android Studio использует ВСЕ потому, что это IDE - она собирает программу, а не выполняет ее.
А вот конкретное устройство, на котором запущено приложение, только те из ресурсов с квалификаторами (-v11 в вашем случае квалификатор версии SDK), которые подходят именно этому устройству. Вам нужно срочно ознакомиться с назначением квалификаторов при выборе альтернативных (наиболее подходящих под текущее устройство, на котором запущено приложение) ресурсов.
Конкретно по вашему вопросу. Файл стилей (и все прочие файлы в этой папке), который находится в папке /res/values-v11/ будет использоваться для устройств (смартфонов, планшетов и пр.) на которых установлено SDK11 или выше (Android 3.0 Honeycomb и новее). То, что находится в папке /res/values/ - ресурсы по умолчанию (без каких-либо квалификаторов), они будут использоваться для устройств, к которым не удалось выбрать ресурсы с квалификаторами. В вашем случае на всех устройствах с версией андроид меньше Android 3.0 Honeycomb (API 10 и менее).
Этот материал нужно усвоить очень серьезно, потому что это одна из основ андроид-разработки (правильная поддержка фрагментации устройств)

Что такое Android Support Repository?

Зачем нужен Android Support Repository? Что он делает и содержит?


Ответ

Android Support Repository - локальная копия на вашем компьютере репозитория Maven, которая содержит скомпилированные версии (.aar) библиотек поддержки Google (такие, как support:appcompat, support:design , support:v7 и тд.)
Находится по пути: \Android\Sdk\extras\android\m2repository\com\android\support
Используется для оффлайн работы IDE и ускорения сборки проекта, так как в этом случае не требуется выкачивать эти библиотеки из интернета, когда они понадобятся в проекте, она получает их с вашего компьютера.
Если вы не используете никаких библиотек поддержки Google, то локальная копия репозитория вам ни к чему, однако в современной андроид-разработке трудно представить приложение, которое не использует этих библиотек.
Android Support Library -локальная копия исходных кодов библиотек поддержки Google. Используется для того, чтобы, собственно, посмотреть, как там все устроено, скопировать ресурсы для кастомизации, сделать кастомные вью на основе виджетов библиотек поддержки и тп.

С чего начать большой веб-проект?

Тематика e-commerce. Проект достаточно большой, но согласно методикам "гибкой разработки", надо разбить проект на спринты в 1-2 недели каждый.
Каждый спринт должен заканчиваться вполне рабочей версией продукта, пусть и с очень ограниченным функционалом. После каждого спринта этот функционал будет становиться шире. Вроде бы все понятно.
Но что-то я застопорился с началом. Как начинаю расписывать задачу для спринта по функционалу, так сразу понимаю, что двумя неделями тут даже и не пахнет. Минимум месяц, а то и два!
Как обычно поступают в студиях, работающих по такой методике? Быть может накидать интерфейс на "бумажке" и начать с этого(с front-end)? Или с головой окунуться в самое сложное из функционала - и реализовывать это? Или сразу сесть и начать продумывать структуру БД? (но есть опасность, что что-нибудь важно упущу, а потом всю структуру переделывать заного). Как же выстроить канбан?


Ответ

Основная суть скрама - максимизировать обратную связь, не слишком отвлекая при этом разработчиков. Ради этого вводят итерации. Суть итерации - получение инкремента - пригодного к использованию приращения продукта. Пригодность к использованию (готовность) - это основной критерий. Потому что только то, что можно использовать, может дать настоящую, качественную обратную связь.
Прототип - дает обратную связь. Схема базы - вообще никак.
Учтите, что скрам - это методология для команд от 5 до 9 человек. Целиком он вам он не нужен.
Для команд из одного человека готовых методологий нет. Делайте в том порядке, в котором вам удобнее.
Единственное, что я бы вам посоветовал (раз совсем не знаете, за что схватиться) - начинать не с интерфейса или базы. А с расписывания основных user story. Выберите из них самые важные, и реализуйте одну за одной (дописывая по необходимости тесты, базу и код).

Как скрыть флаги при компиляции?

При компиляции проекта для каждого файла используется безумное количество флагов.
Как сделать, чтобы эти флаги во время компиляции не выводились на экран?
К примеру, хочу оставить только путь к компилируемому файлу и результат его компиляции. В make-файле команда для цели, как понимаю, вся выводится на экран. Проект написан на C.


Ответ

Какой бы не был makefile, но там в конечном счете должен быть вызов компилятора. Если перед этой сторокой добавить @, то эта строка не будет выводиться. Теперь перед этой строкой достаточно вставить @echo gcc $@ или что то подобное и будет "красивый вывод". Аналогично и с линковкой.