Langsamer Transfer von Medien von iOS zu macOS

Wer ein neueres iOS-Gerät nutzt und von diesem, mittels der macOS-App Digitale Bilder, Bilder auf den Mac herunterlädt wird feststellen, das dieser Prozess eine Weile dauert. Im Gegensatz zum Transfer von älteren iOS-Geräten ist der Transfer objektiv gesehen wirklich langsamer. Hintergrund hierfür ist eine Konvertierung, welche von der App vorgenommen wird.

Die Option Originale behalten sorgt für einen schnelleren Transfer

Vorgenommen wird die Konvertierung, weil die neueren iOS-Geräte die Bilder und Videos im High Efficiency Image File Format kurz HEIF speichern und diese während des Transfers in gewöhnliche JPEG- und MOV-Dateien konvertiert werden. Um dies zu vermeiden, kann in der Digitale Bilder-App die Option Originale behalten aktiviert werden. Damit werden die Medien ohne Konvertierung direkt auf den Mac übertragen. Die macOS eigene App Photos kommt problemlos mit diesen Dateien zurecht. Auf Wunsch können die Dateien mittels Photos wieder in gebräuchlichere Formate konvertiert werden.

Logic Pro X-Projekte in GarageBand für iOS öffnen

GarageBand und Logic Pro X sind zwei Digital Audio Workstations von Apple. Während sich GarageBand mehr an Einsteiger richtet, ist Logic Pro X für professionelle Produktionen gedacht. GarageBand-Projekte können problemlos von Logic Pro X geöffnet werden. Umgekehrt sieht dies anders aus. Beim Öffnen von GarageBand-Projekten in Logic Pro X, werden diese konvertiert. Nach der Konvertierung lassen sich die Projekte nicht mehr in GarageBand öffnen.

Logic Pro X

Allerdings gibt es durchaus eine Möglichkeit Logic Pro X-Projekte in GarageBand für iOS zu nutzen. Dazu muss das Projekt in Logic Pro X geöffnet werden und anschließend im Menü Ablage der Punkt Teilen ausgewählt werden. Dort findet sich der Menüpunkt Projekt für GarageBand für iOS. Nachdem der Menüpunkt ausgewählt wurde, kann das Projekt exportiert werden. Leider werden MIDI- und Instrumenten-Spuren hierbei in Audio konvertiert, welches sich anschließend nicht mehr entsprechend bearbeiten lässt.

Daten unter Java in ein Byte-Array umwandeln

Für ein Projekt wollte ich eine Liste von long-Werten unter Java in ein einzelnes Byte-Array umwandeln. Dafür kann unter Java die Klasse ByteBuffer genutzt werden. In diesem Beispiel wird eine Liste namens dataStream definiert:

List dataStream = new ArrayList<>();

In dieser Liste befinden sich eine unbestimmte Anzahl von Werten. Mit der Klasse ByteBuffer kann diese Liste bzw. die Werte in der Liste in ein Byte-Array überführt werden:

ByteBuffer byteBuffer = ByteBuffer.allocate(dataStream.size() * 8);

for(long value: dataStream) {
	byteBuffer.putLong(value);
}

byte[] array = byteBuffer.array();

Im ersten Schritt wird der ByteBuffer mit einer Kapazität angelegt, welcher der Größe der long-Werte in Byte entspricht. Anschließend werden die long-Werte in den ByteBuffer geschrieben. Ist dies geschehen kann ein Byte-Array aus dem ByteBuffer erstellt werden. Damit ist die Umwandlung abgeschlossen.

Konvertierungen zwischen alter und neuer Datums- und Zeit-API

Seit Java 8 verfügt die Programmiersprache über eine sinnvolle Datums- und Zeit-API. In den meisten Fällen kann diese API ohne weitere Probleme genutzt werden. Problematisch wird es nur, wenn die neue API im Zusammenhang mit Legacy-Code genutzt werden soll. Meist wird dort die Klasse Date aus dem Package java.util genutzt. Damit werden Methoden benötigt, um eine Brücke von der alten zur neuen API und umgekehrt zu schlagen. Um ein Date in eine LocalDateTime umzuwandeln, kann folgende Methode genutzt werden:

public static LocalDateTime convertToLocalDateTime(Date date) {
    return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}

Soll der Wert, welcher in der LocalDateTime gespeichert ist, wieder in ein Date-Objekt konvertiert werden, kann folgende Methode genutzt werden:

public static Date convertToDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}

Bei diesen Konvertierungsmethoden ist zu beachten, dass die Zeitzonen bei der Konvertierung ignoriert werden. Stattdessen wird die Konvertierung mit der Standardzeitzone des Systems durchgeführt. Für die Konvertierung unter Berücksichtigung und Speicherung der Zeitzonen kann die Klasse ZonedDateTime genutzt werden. Die entsprechenden Methoden zur Konvertierung wären folgende:

public static ZonedDateTime convertToZonedDateTime(Date date, ZoneId zoneId) {
    return date.toInstant().atZone(zoneId);
}

public static Date convertToDate(ZonedDateTime zonedDateTime) {
    return Date.from(zonedDateTime.toInstant());
}

Bei der Konvertierung einer Date-Instanz in eine ZoneDateTime muss die entsprechende Zeitzone als ZoneId mitgegeben werden.

Konvertierung der Map von Minecraft 1.12 auf 1.13 durchführen

Vor einigen Wochen erschien Version 1.13 des Open-Word-Spieles Minecraft. Im Zuge dieser Aktualisierung wurden unter anderem die Daten der Blöcke verändert. Beim Erzeugen der Weltkarte über die freie Minecraft-Rendersoftware Mapcrafter traten nach dem Update Probleme auf.

Nur die bereits konvertierten Chunks werden gerendert

Während der Server ohne Probleme lief, wurden in der Karte nur bestimmte Chunks gerendert. Der Grund hierfür war das nur die Chunks in das neue Format der Version 1.13 konvertiert wurden, die von den Spielern auf dem Server besucht worden waren. Alle anderen Chunks lagen noch im Format der Version 1.12 vor. Eine Lösung für dieses Problem schafft der mit 1.13 neu eingeführte Kommandozeilen-Parameter –forceUpgrade des Minecraft-Servers. Wenn man diesen entsprechend startet:

java -Xmx4096M -Xms2048M -jar minecraft_server.jar nogui --forceUpgrade

beginnt der Server alle Chunks in das neue Format zu überführen:

[06:42:34] [Server thread/INFO]: Starting minecraft server version 1.13.1
...
[06:42:34] [Server thread/INFO]: Forcing world upgrade!
[06:42:34] [Server thread/INFO]: Counting chunks...
[06:42:48] [Server thread/INFO]: Upgrading structure data...
[06:42:48] [Server thread/INFO]: 0% completed (0 / 1630135 chunks)...
[06:42:49] [Server thread/INFO]: 0% completed (0 / 1630135 chunks)...
..
[08:52:58] [Server thread/INFO]: 99% completed (1629866 / 1630135 chunks)...
[08:52:59] [Server thread/INFO]: 99% completed (1630017 / 1630135 chunks)...
[08:53:00] [pool-4-thread-1/INFO]: World optimizaton finished after 7812721 ms

Je nach der Größe der eigenen Welt kann dieser Vorgang durchaus einige Stunden in Anspruch nehmen. Nachdem alle Chunks konvertiert wurden, funktioniert das Rendering der Weltkarte wieder wie gewohnt.