Archiv der Kategorie: Computerkram

Solr, Nutch und boost

Der Web-Crawler nutch berechnet aus der Linkstruktur einen Score und speichert ihn im Feld „boost“ ab. Leider scheint der boost nicht automatisch in den Gesamt-Score einzugehen. Eine Verwendung des Felds boost in der boost function (bf) des dismax-Parsers scheitert mit einer Fehlermeldung, weil die standardmäßige schema.xml von nutch das Feld nicht als uninvertible deklariert. Die Doku fand ich leider wenig hilfreich.

Eine Änderung der schema.xml im nutch-configset brachte für mich Abhilfe. Die Felddeklaration von boost sollte so aussehen:

<field name="boost" type="float" stored="true" uninvertible="true"/>

Anschließend kann bei der Solr-Suche im dismax-Parser in der bf das Feld boost verwendet werden. Es handelt sich dabei um einen additiven Boost für jedes Dokument. In der debug-Ansicht lässt sich die Berechnung des Scores nachvollziehen.

Ubuntu 22 auf dem Raspberry Pi

… für Nextcloud

Ein weiterer Beitrag aus der Rubrik „Notizen über Computerkram für mich selbst“.

Raspberrypios kommt aktuell von Haus aus noch mit PHP 7. PHP lässt sich mit einer externen Paketquelle auf 8.0 bringen. Nextcloud wird für die kommende Version aber PHP 8.1 und ein 64-Bit-Betriebssystem brauchen. Daher sollte Ubuntu 22.04 LTS 64 Bit auf einen Raspi 3 kommen.

Der Pi-Imager kann direkt Einstellungen wie Benutzername, SSH-Public Key, WLAN-Kennung und Passwort usw. übertragen und tut dies mit cloud-init. Dies kann später zu Überraschungen führen, da Änderungen in Ubuntu, die an den sonst üblichen Stellen vorgenommen werden, beim nächsten Start von cloud-init wieder zurückgesetzt werden. Dies war der erst Punkt, der mich Nerven gekostet hat. Da cloud-init meiner Auffassung nach wenn die Ersteinrichtung erledigt ist an sich nicht mehr gebraucht wird, habe ich mich entschieden, cloud-init zu entfernen.

sudo apt remove cloud-init

Der zweite Punkt, der mich Nerven gekostet hat, war, dass aus welchen Gründen auch immer der Raspi nun so konfiguriert war, dass er zwar die WLAN-Zugangsdaten über cloud-init vom Imager vorher korrekt bekommen hat, aber die LAN-Buchse nicht aktiv ist!

Das Netzwerk kann über netplan konfiguriert werden, cloud-init hinterlässt die Datei /etc/netplan/50-cloud-init.yaml für die Konfiguration von netplan, die auch die WLAN-Daten enthält, allerdings keinen Eintrag für die LAN-Buchse.

Über den NetworkManager geht das ganze sorgenfrei, allerdings ist der erst Mal nicht installiert. Also:

sudo apt install network-manager

Jetzt erst mal nen gescheiten Editor installieren:

sudo apt install emacs

Dann in der Datei /etc/netplan/50-cloud-init.yaml nach network: und vor wifis: die Zeile

renderer: NetworkManager

einfügen und weiter unten renderer: networkd auskommentieren oder löschen.

sudo emacs /etc/netplan/50-cloud-init.yaml

Noch eine kleine Aufzählung von Paketen, die ich für Nextcloud auf Apache sowie für Dateiverschlüsselung und für Let’s Encrypt installieren musste:

sudo apt install mariadb-server apache2 php
sudo apt install php-mysql php-xml php-zip php-mbstring
sudo apt install php-curl php-gd php-imagick
sudo apt install php-gmp php-bcmath php-intl
sudo apt install cryptsetup
sudo apt install ecryptfs-utils
sudo apt install certbot
sudo apt install python3-certbot-apache

Und nun noch das Zertifikat holen:

sudo certbot --apache

Nun sollte alles bereit sein. Nextcloud installiere ich nicht über eine Paketquelle sondern kopiere es in /var/www/html/nextcloud/ Den Owner stelle ich auf…

sudo chown -R www-data:www-data /var/www/html

Sofern das Nextcloud-Datenverzeichnis woanders liegt muss das dem selben User gehören.

Closed Book Information Retrieval

Der auf maschinellem Lernen basierende Chat-Bot ChatGPT sorgt aktuell für einiges Aufsehen. Da die Antworten eine für Software noch nicht dagewesene sprachliche Qualität erreichen, besteht die Gefahr, dass Schüler und Studierende zur Anfertigung von Hausarbeiten darauf zurückgreifen könnten. Dies ist ein Problem, dass auch in meinem Kollegenkreis diskutiert wird. Wie sollte man darauf reagieren, wenn sachlich Falsches so gut dargestellt wird, dass es richtig überzeugend wirkt?

Vor diesem Hintergrund wollte ich testen, was passiert, wenn man ChatGPT nach etwas selbst ausgedachtem fragt. Hier ist mein Dialog:

What is "closed book-case information retrieval"? Please cite scientific sources!

Mal sehen, was ChatGPT mit dem „geschlossenen Bücherschrank“ anfängt.

Closed book information retrieval (CBIR) is a type of information retrieval (IR) system that does not have access to external resources or external knowledge beyond the documents in the collection being searched. CBIR systems rely solely on the content of the documents in the collection to retrieve relevant documents in response to a user's query.

CBIR systems are commonly used in situations where external resources are not available or are not reliable, such as when searching a closed-access document collection or when the quality or relevance of external resources is uncertain. CBIR systems can also be useful in situations where the content of the documents in the collection is highly specialized or domain-specific, and external resources may not be relevant or may not provide enough context to support effective retrieval.

One example of a CBIR system is a search engine that is designed to search a collection of documents on a specific topic, such as a corporate intranet or a specialized database. Another example is a digital library system that allows users to search a collection of digitized books, articles, or other documents.

There is a large body of research in the field of information retrieval on CBIR systems, and many different approaches have been developed to improve their effectiveness. Some common approaches include the use of natural language processing techniques to extract relevant information from the documents in the collection, the use of machine learning algorithms to improve the accuracy of document ranking and relevance, and the use of user feedback and interaction to refine search results and improve the overall user experience.

Some references for further reading on CBIR include:

    Salton, G., & McGill, M. J. (1983). Introduction to modern information retrieval. New York: McGraw-Hill.
    Baeza-Yates, R., & Ribeiro-Neto, B. (1999). Modern information retrieval. New York: ACM Press.
    Manning, C. D., Raghavan, P., & Schütze, H. (2008). Introduction to information retrieval. Cambridge University Press.
    Liu, B. (2008). Web data mining: Exploring hyperlinks, contents, and usage data. Springer.

ChatGPT lässt den Term „Case“ stillschweigend fallen und liefert mir eine schöne Definition für „Closed Book Information Retrieval“ ab.

Die finde ich tatsächlich ziemlich überzeugend, und zwar so sehr, dass ich an mir selbst zweifle. Hab ich etwa für meinen Versuch einen Begriff gewählt, den es tatsächlich gibt?

Eine Web-Suche nach „Closed book information retrieval“ liefert allerdings (Stand 22.12.22) erwartungsgemäß nichts. Wer diese Zeilen liest, wird möglicherweise diese Seite hier als Treffer bekommen. Ein gutes Gefühl, den wahrscheinlich ersten Artikel über Closed Book Information Retrieval verfasst zu haben.

Eine Suche nach „CBIR“ liefert nur „Content Based Image Retrieval“. „Closed book QA systems“ sind anscheinend tatsächlich ein Ding, aber der Begriff ist nicht sehr weit verbreitet und ChatGPT sagt auch nichts über QA-Systeme.

Die als Referenzen angegebene Literatur gibt es tatsächlich, freilich steht darin nichts über Closed Book Information Retrieval.

Ich frage ChatGPT nach Beispielen:

Please give me an example of a publicly available closed book IR search engine!

ChatGPT liefert:

One example of a publicly available closed book information retrieval (IR) search engine is the Digital Public Library of America (DPLA). The DPLA is a national digital library that provides access to a wide variety of digital resources, including books, articles, images, and other materials from libraries, archives, and cultural heritage institutions across the United States. The DPLA search engine allows users to search the collection of digitized resources using keywords, phrases, and other search criteria, and returns relevant results from within the DPLA collection.

Another example of a publicly available closed book IR search engine is the Internet Archive, which is a non-profit digital library that provides access to a wide variety of digital resources, including books, articles, images, and other materials from libraries, archives, and cultural heritage institutions around the world. The Internet Archive search engine allows users to search the collection of digitized resources using keywords, phrases, and other search criteria, and returns relevant results from within the Internet Archive collection.

Both the DPLA and the Internet Archive are examples of closed book IR systems because they rely solely on the content of the resources in their collections to retrieve relevant results in response to user queries, and do not have access to external resources or external knowledge beyond the documents in their collections.

Die genannten Beispiele existieren wirklich sind auch (halbwegs) konsistent mit der aufgestellten Definition.

Ich versuche mal, ChatGPT nach etwas wirklich absurdem zu fragen:

What is "super-critical" information retrieval?

ChatGPT riecht Lunte und merkt, dass es das nicht gibt:

I'm sorry, but I'm not familiar with the term "super-critical" information retrieval. It's possible that this is a term that has been coined and used in a specific context or by a particular group of researchers or practitioners, but without more context or information it is difficult for me to provide a meaningful explanation.

In general, the term "information retrieval" (IR) refers to the process of finding and retrieving relevant information from a collection of documents or other sources of information, typically in response to a user's query. IR systems can be designed to search a variety of types of collections, including text documents, images, videos, and other types of multimedia content, and can be implemented using a range of different techniques and approaches.

If you could provide more context or information about the specific context in which the term "super-critical" information retrieval is being used, I would be happy to try to provide a more helpful response.

Der Bot fragt mich nach Kontext, den gebe ich doch gerne:

What is super-critical information retrieval in the context of classification of very short texts? Can you cite a source?

Die Software kann immer noch nichts damit anfangen und wiederholt die Definition von Information Retrieval im allgemeinen:

I'm sorry, but I still don't have enough information to provide a meaningful response to your question. While the term "super-critical" may be used in the context of classification of very short texts, without knowing more about the specific context in which it is being used, it is difficult for me to provide a clear explanation or to cite a relevant source.

In general, "information retrieval" (IR) refers to the process of finding and retrieving relevant information from a collection of documents or other sources of information, typically in response to a user's query. This can involve a variety of tasks, such as indexing and organizing documents in a collection, extracting relevant information from the documents, and ranking and presenting the documents to the user in a way that is relevant and useful.

There are many different approaches and techniques that can be used in IR, and the specific approach or technique that is most appropriate will depend on the characteristics of the collection being searched and the needs and goals of the users. For example, when classifying very short texts, such as tweets or social media posts, it may be necessary to use techniques that are specifically designed to handle the unique characteristics of these types of documents, such as their brevity and the high degree of variability in their content and structure.

If you could provide more specific information about the context in which the term "super-critical" information retrieval is being used, I would be happy to try to provide a more helpful response.

ChatGPT lässt sich also so leicht nicht aufs Glatteis führen.

Aber zurück zu Closed Book:

Lets go back to closed book IR. Can you point out, where exactly in the manning book closed book ir is mentioned?

Ich hake nach und will es genau wissen. Ich kenne das genannte Buch von Manning, Raghavan und Schütze ganz gut und weiß, dass da nichts über „Closed Book IR“ drin steht.

In the book "Introduction to Information Retraction" by Christopher D. Manning, Prabhakar Raghavan, and Hinrich Schütze, the concept of closed book information retrieval (CBIR) is introduced and discussed in Chapter 3, titled "Boolean Retrieval."

Here is an excerpt from the book that explains the concept of CBIR:

"In closed book retrieval, a user poses a query to a search engine and the search engine responds with a list of documents, ranked in order of relevance, from a pre-specified collection. In contrast, in open book retrieval the search engine can go beyond the pre-specified collection and can use external resources, such as the World Wide Web, to try to find an answer to the user's query. Closed book retrieval is typically used when the collection is small and well-defined, such as a corporate intranet or a digital library, or when the quality or relevance of external resources is uncertain."

You can find this discussion in the following location in the book:

    Chapter 3, "Boolean Retrieval," Section 3.1, "Basic Boolean Model," page 65

I hope this helps! If you have any other questions or need further clarification, please don't hesitate to ask.

Der Bot erkennt, was ich mit „Manning Book“ meine, aber wenn man genau hinschaut fällt auf, dass der Titel des Buchs auf einmal „Introduction to Information Retraction“ sein soll.

ChatGPT saugt sich jetzt was aus den Fingern. Schaute man an der angegebenen Stelle nach, würde der Beschiss jetzt auffliegen. Interessant ist, dass es sogar tatsächlich ein Kapitel „Boolean Retrieval“ gibt, allerdings ist das Kapitel 1.

Versuchen wir mal ein Fachgespräch. ChatGPT schreibt was von Ranking. Das hätte ich in einem Kapitel über Boolesches Retrieval nicht vermutet, denn üblicherweise spielt Ranking dabei gerade keine Rolle. In dem genannten Buch ist folglich in dem Kapitel über Boolean Retrieval das Thema Ranking nicht erklärt, sondern kommt erst in den Kapiteln 6 und 7 dran.

Ich frage also mal nach:

Why would a textbook chapter on boolean retrieval mention ranking?

ChatGPT antwortet:

In the field of information retrieval (IR), ranking is a common approach for presenting search results to users in a way that is relevant and useful. When a user performs a search using a search engine or other IR system, the system typically returns a list of documents or other resources that are relevant to the user's query. The order in which these results are presented to the user can be important, as it can affect the user's ability to find the information they are looking for and can also influence their overall satisfaction with the search experience.

In IR systems, ranking is typically used to order the search results based on their relevance to the user's query. Relevance is usually determined using a combination of factors, such as the presence of relevant keywords or phrases in the documents, the importance or credibility of the documents or their sources, and the context in which the documents are used.

Ranking can be implemented using a variety of different approaches, including mathematical models that use statistical or probabilistic techniques to determine the likelihood that a document is relevant to a given query, or machine learning algorithms that learn to predict relevance based on examples of relevant and non-relevant documents.

In the context of boolean retrieval, ranking is often used to present the search results to the user in a way that is more meaningful and useful. Boolean retrieval is a type of IR system that allows users to search a collection of documents using boolean operators (such as AND, OR, and NOT) to combine keywords or phrases into more complex queries. By ranking the search results based on their relevance to the query, boolean retrieval systems can help users to more easily find the information they are looking for within the collection.

I hope this helps to clarify why ranking might be mentioned in a textbook chapter on boolean retrieval. If you have any other questions or need further clarification, please don't hesitate to ask.

Ganz nette Begründung. Aber wenn wir mal bei dem Buch von Manning et al. bleiben, dort ist in der Tat ausdrücklich erwähnt, dass Ranked Retrieval etwas anderes ist als Boolean Retrieval. Da hat ChatGPT das Buch wohl gar nicht richtig gelesen…

Zeit, ChatGPT mal zu konfrontieren:

Can you prove that the phrase "closed book information retrieval" is not something I just made up a few moments ago?

ChatGPT will sich rausreden, aber bleibt dennoch standhaft dabei, dass es Closed Book Information Retrieval wirklich gibt und behauptet sogar, dass sei doch ein etablierter Begriff!

I'm sorry, but as an AI language model, I do not have the ability to verify the origin or history of specific phrases or terms. However, the phrase "closed book information retrieval" (CBIR) is a well-established term in the field of information retrieval (IR), and has been used by researchers and practitioners for many years.

CBIR refers to a type of IR system that does not have access to external resources or external knowledge beyond the documents in the collection being searched. CBIR systems rely solely on the content of the documents in the collection to retrieve relevant documents in response to a user's query.

CBIR systems are commonly used in situations where external resources are not available or are not reliable, such as when searching a closed-access document collection or when the quality or relevance of external resources is uncertain. CBIR systems can also be useful in situations where the content of the documents in the collection is highly specialized or domain-specific, and external resources may not be relevant or may not provide enough context to support effective retrieval.

You can find more information about CBIR in the scientific literature on information retrieval, including the references that I provided in my previous response.

Ich habe die „Diskussion“ noch ein wenig weitergeführt. Einen Teil lasse ich hier mal aus. Es gelingt mir aber leicht, ChatGPT noch eine weitere erfundene Textstelle zu entlocken:

Can you give me another example where closed book information retrieval is mentioned in literature?

In der Antwort wird auch wieder ein Buch referenziert, dass es tatsächlich gibt, aber der präsentierte Auszug ist so nicht vorhanden.

Certainly! Here is another example of where the concept of closed book information retrieval (CBIR) is mentioned in the literature:

In the book "Web Data Mining: Exploring Hyperlinks, Contents, and Usage Data" by Bing Liu, CBIR is discussed in Chapter 3, titled "Information Retrieval Basics."

Here is an excerpt from the book that explains the concept of CBIR:

"In closed book information retrieval, the search engine only has access to a pre-specified collection of documents and returns search results from this collection. In open book information retrieval, the search engine can go beyond the pre-specified collection and use external resources, such as the World Wide Web, to try to find an answer to the user's query. Closed book information retrieval is typically used when the collection is small and well-defined, such as a corporate intranet or a digital library, or when the quality or relevance of external resources is uncertain."

You can find this discussion in the following location in the book:

    Chapter 3, "Information Retrieval Basics," Section 3.3, "Boolean Retrieval," page 63

I hope this helps! If you have any other questions or need further clarification, please don't hesitate to ask.

Belassen wir es mal dabei, keine weiteren Fragen.

Es bleibt die Erkenntnis, dass ChatGPT sehr überzeugend sein kann und wir in Zukunft zum Beispiel in der Rolle als Prüfer noch genauer als bisher nachforschen müssen, wenn Quellen zitiert werden, ob das, was angeblich dort stehen soll, auch tatsächlich dort steht.

Solr Authentication

Aus der beliebten Serie „ein paar unsortierte Notizen mit Computerkram für mich selbst“ hier wie man in Solr 8.1 die Authentifizierung einschaltet (und anschließend aus Python heraus mir urllib abfragt). Quellen sind die Doku von Solr und die Doku von urllib.

Standardmäßig ist es bei Solr so, dass ohne jede Authentifizierung über die Admin-Oberfläche alles gemacht werden kann, insbesondere auch Dokumente aus dem Korpus löschen und so weiter! Die hier beschriebene Basic Authentication ist wenigstens ein Minimum an Zugriffsschutz, aber nach heutigen Maßstäben ist es nicht so sicher, jedenfalls nicht wenn man es nicht mit HTTPS kombiniert. Es ist empfehlenswert, zusätzlich dafür zu sorgen, dass der Solr-Server nicht aus dem Internet erreichbar ist.

Ins Verzeichnis solr-8.10.1/server/solr kommt in die Datei security.json folgender Inhalt:

{
"authentication":{ 
   "blockUnknown": true, 
   "class":"solr.BasicAuthPlugin",
   "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}, 
   "realm":"My Solr users", 
   "forwardCredentials": false 
},
"authorization":{
   "class":"solr.RuleBasedAuthorizationPlugin",
   "permissions":[{"name":"security-edit",
      "role":"admin"}], 
   "user-role":{"solr":"admin"} 
}}

Was bei credentials hinter dem Usernamen steht ist nicht so gut dokumentiert, offenbar wird erwartet, dass man das solr-Skript mit dem Kommando auth benutzt. Das nölt aber immer rum, wenn man nicht den ZooKeeper sondern eine Standalone-Installation verwendet. In der Beispieldatei ist das Passwort „SolrRocks“, der abgelegte String ist im Prinzip ein salted sha256, aber die Methode, wie das zustande kommt, ist etwas dubios. Auf github habe ich ein Skript gefunden, mit dem man den credentials-String erzeugen kann. Evtl. sind dafür noch Packages nachzuinstallieren, z.B. pwgen. Der Salt wird automatisch erzeugt und muss nicht angegeben werden.

#!/bin/bash
PW=$1
SALT=$(pwgen 48 -1)
echo "hash    : $(echo -n "$SALT$PW" | sha256sum -b | xxd -r -p | sha256sum -b | xxd -r -p | base64 -w 1024) $(echo -n "$SALT" | base64 -w1024)"

Mehrere credentials bestehend aus Usernamen und salted hashs können JSON-mäßig mit Komma hintereinander gehängt werden.

Und hier noch wie man in Python bei urllib die HTTP-Authentication benutzt:

    # Create an OpenerDirector with support for Basic HTTP Authentication...
    auth_handler = urllib.request.HTTPBasicAuthHandler()
    auth_handler.add_password(realm='My Solr users',
                              uri='http://localhost:8983/',
                          user='solr',
                          passwd='SolrRocks')
    opener = urllib.request.build_opener(auth_handler)
    # ...and install it globally so it can be used with urlopen.
    urllib.request.install_opener(opener)

Das Passwort steht dann halt im Klartext da drin. Das billige Authentication-Modul von Solr wird sicherheitsmäßig eh nicht für jeden Bedarf ausreichen und sollte für den Produktivbetrieb jedenfalls nicht als einzige Zugriffsbeschränkung benutzt werden.

Um mit dem Solr-Skript von der Kommandozeile Dinge zu erledigen (z.B. einen neuen Core anlegen) müssen bei eingeschalteter Basic Authentication noch folgende Variablen gesetzt werden (wie bei allem gilt, den Usernamen und das Passwort durch die eigenen zu ersetzen). Folgendes ist in die bin/solr/solr.in.sh einzusetzen bzw. die im Beispiel schon vorhandenen entsprechenden Zeilen auszukommentieren:

SOLR_AUTH_TYPE=basic
SOLR_AUTHENTICATION_OPTS="-Dbasicauth=solr:SolrRocks"

Netflix auf dem Raspberry Pi – Update 2022

Für das Media-Center Kodi gibt es nach wie vor ein inoffizielles Netflix-Plugin. Inzwischen ist Kodi 19 aktuell, daher ist mal wieder ein Update der Anleitung erforderlich. Auf dem Raspberry Pi läuft LibreELEC als speziell angepasste Distribution für Kodi. Mit dem Raspberry Pi Imager kann man sich eine SD-Karte dafür erstellen. Wenn in der Auswahl die passende LibreELEC-Version nicht auftaucht, weil man gerade keinen Raspi 4 zur Hand hat, kann man sich direkt von der LibreELEC-Webseite eine Version für den Raspi 2 oder 3 runterladen.

Das Netflix-Plugin liegt im inoffiziellen Kodi-Plugin-Repository von CastagnaIT. Auf dieser Github-Seite ist u.a. ein ZIP, mit dem sich das Repo in Kodi nachinstallieren lässt und aus diesem Repo dann das Netflix-Plugin.

Benötigte Dependencies (InputStream, Widevine…) werden spätestens dann nachinstalliert, wenn man versucht einen Film zu schauen.

Es versteht sich von selbst, dass ein gültiges Netflix-Login Voraussetzung ist.

FXGL11 Level laden

Anscheinend hat sich bei FXGL11 gegenüber den teilweise schon etwas älteren Tutorials was geändert. Das ist eine Sache.

Eine andere, die mich grad in den Wahnsinn getrieben hat, war, dass das Laden eines mit Tiled erstellten Levels schon schief ging, weil das eigentlich vorgesehene, simple

    FXGL.setLevelFromMap("level0.tmx");

die Datei offenbar am falschen Ort gesucht hat. Nach ewigem Rumprobieren mit der Verzeichnisstruktur gab es Abhilfe letztlich nur mit dem etwas umständlicheren:

protected void initGame() {
    FXGL.getGameWorld().addEntityFactory(
        new PlanetExpressFactory());
    TMXLevelLoader tl = new TMXLevelLoader();
    FXGL.getGameWorld()
        .setLevel(tl.load(
        this.getClass().getResource("/assets/levels/level0.tmx"),
        FXGL.getGameWorld()));
}

JavaFX Mac-App erstellen mit Eclipse und Maven

… mit OpenJDK und JavaFX in der Version 14.

JavaFX braucht nicht extra installiert werden, wenn man ein neues Maven-Projekt über den Archetyp org.openjfx aus Maven Central erstellt. Um die Dependencies kümmert sich Maven.

In der pom.xml den Pfad zum jlinkExecutable einstellen sowie einen Launcher festlegen:

<plugin>
  <groupId>org.openjfx</groupId>
  <artifactId>javafx-maven-plugin</artifactId>
  <version>0.0.4</version>
  <configuration>
    <mainClass>package.App</mainClass>
    <jlinkExecutable>/Pfad/zu/jlink</jlinkExecutable>
    <launcher>MeinLauncherSkript</launcher>
  </configuration>
</plugin>

Dann aus Eclipse die pom ausführen als Maven build… und bei Goals javafx:jlink einstellen.

Es wird im target-Verzeichnis ein Verzeichnis image erzeugt, dass u.a. die angepasste Java Runtime sowie ein Launcher-Skript enthält. Vom Terminal aus kann das Launcher-Skript jetzt schon gestartet werden.

Um ein schönes .app-Bundle zu erzeugen, im Terminal ins target-Verzeichnis wechseln und dann:

jpackage --type app-image -i image -n MeineApp -m mein.modul/mein.package.Mainclass --runtime-image image/

Wenn jpackage nicht gefunden wird, muss der Pfad noch händisch gesetzt werden. jpackage liegt ganz normal im bin-Verzeichnis des JDK.

Natürlich sind jeweils die richtigen Namen für die Module, Packages und Klassen einzusetzen. Es kommt dann eine schöne Mac-Application raus, die sich durch Doppelklick starten lässt. (Ich bin mir nicht sicher, ob XCode dafür installiert sein muss, damit das Packagen funktioniert. Bei mir war’s drauf.) Ist dann halt > 100 MB, aber egal. :-]

Amazon Prime Video und Netflix auf dem Raspberry Pi – Update

Alles ist nun viel einfacher als im letzten Artikel beschrieben. Kodi 18 ist inzwischen aktuell, der ganze Kram mit experimentellen Builds ist Vergangenheit und man muss nicht mal LibreELEC nehmen, sondern kann Kodi unter Raspbian laufen lassen und parallel zu einem Desktop oder RetroPie betreiben.

Das Amazon Prime Plugin muss man sich aber immer noch aus dem Sandmann79 Repository besorgen, das vorher manuell einzutragen ist.

In den Einstellungen des Amazon VOD Plugins musste ich dann noch die Region händisch einstellen, sonst ging der Login nicht.

Außerdem muss (mit apt) das Paket kodi-inputstream-adaptive installiert sein, sonst kann das vom Amazon-Plugin mitinstallierte InputStreamHelper-Plugin in Kodi das Widevine-Geraffel (für’s CRM) nicht herunterladen.

Und dann war halt noch so Kindergartenzeugs einzustellen, wie z.B. der Audio-Kanal, wenn auf einmal der Center-Kanal fehlt…

Für Netflix muss händisch noch Pycryptodome installieren. pip install pycryptodomex

Python: Versionshorror bei Packages

Zwei Python-Packages haben mich gestern und heute mit Bugs unter macos Catalina geärgert:

PyGame

Das noch aktuelle PyGame 1.9.6 läuft auf Macs mit Retina-Display unbrauchbar langsam. Der Full-Screen-Modus bringt nur bedingt Abhilfe. Die Developer-Version von PyGame 2 läuft dagegen normal.

Hat wohl was mit SDL1 zu tun, ist bekannt und mit SDL2 gefixt. PyGame 1 mit SDL2 sollte sich eigentlich über Homebrew compilieren lassen, hat bei mir aber mit einer Compiler-Fehlermeldung abgebrochen. Hab’s dann aufgegeben, da sich PyGame 2 als Wheel installieren lässt. Von Python 3.8 sollte man wohl auch eher absehen.

Nachtrag: Bei PyGame 2 unter Windows scheint es wohl Probleme mit dem Alpha-Kanal zu geben, was Auswirkung auf die Kollisionserkennung mit Maske sowie die Darstellung hat.

asciimatics

Die Version 1.11.0 bringt in der Initialisierungsphase einen Fehler bei curses.cbreak(). Möglicherweise hat sich da was bei Catalina geändert, hab ich dann gestern nicht mehr weiter verfolgt, weil es mich in den Wahnsinn getrieben hat. Die ältere Version 1.10.0 läuft normal.