Hallo, Gast
Du musst dich registrieren bevor du auf unserer Seite Beiträge schreiben kannst.

Benutzername
  

Passwort
  





Durchsuche Foren

(Erweiterte Suche)

Foren-Statistiken
» Mitglieder: 1
» Neuestes Mitglied: Joopi
» Foren-Themen: 452
» Foren-Beiträge: 628

Komplettstatistiken

Benutzer Online
Momentan sind 4 Benutzer online
» 0 Mitglieder
» 2 Gäste
AhrefsBot, bot

Aktive Themen
Thursday - 18:00 CDT: Not...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Vor 24 Minuten
» Antworten: 0
» Ansichten: 0
Thursday - 14:00 CDT: Not...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Vor 4 Stunden
» Antworten: 0
» Ansichten: 4
Thursday - 09:00 CDT: Not...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Vor 9 Stunden
» Antworten: 0
» Ansichten: 7
Thursday - 07:00 CDT: Not...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Vor 11 Stunden
» Antworten: 0
» Ansichten: 3
Thursday - 02:00 CDT: Not...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Gestern, 10:33
» Antworten: 0
» Ansichten: 7
Wednesday - 23:00 CDT: No...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Gestern, 08:10
» Antworten: 0
» Ansichten: 7
Wednesday - 16:00 CDT: No...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
Gestern, 12:50
» Antworten: 0
» Ansichten: 9
Wednesday - 12:00 CDT: No...
Forum: Wetter in Little Rock
Letzter Beitrag: Joopi
18-09-2024, 08:53
» Antworten: 0
» Ansichten: 6
Zahnverzapfung herstellen...
Forum: Antiheimwerker
Letzter Beitrag: Joopi
18-09-2024, 07:25
» Antworten: 0
» Ansichten: 4
Holzdübel bei Gehrung set...
Forum: Antiheimwerker
Letzter Beitrag: Joopi
18-09-2024, 07:06
» Antworten: 0
» Ansichten: 7

 
  Synaptic - Schnellsuche installieren
Geschrieben von: Joopi - 11-01-2023, 08:56 - Forum: Linux - Keine Antworten

Auch wenn Ubuntu eine eigene Variante der Softwareverwaltung vorhält, ist mir Synaptic als grafische Oberfläche immer noch am liebsten. Bei einer Neuinstallation jedoch ist die Schnellsuche im Standard nicht vorhanden. Diese muss mit 2 Befehlen nachinstalliert werden:

Code:
sudo apt-get install apt-xapian-index

Unter Debian 10 Buster ist dieser Befehl nicht mehr ausführbar, stört aber nicht.

Code:
sudo update-apt-xapian-index -vf

Drucke diesen Beitrag

  Standard-Displaymanager wechseln
Geschrieben von: Joopi - 11-01-2023, 08:55 - Forum: Linux - Keine Antworten

Man kann in Ubuntu relativ einfach den Standard-Displaymanager wechseln. Unter diesem Link habe ich eine für Ubuntu 20.04 LTS nutzbare Anweisung gefunden:

Standard-Displaymanager wechseln

Zunächst ist der aktuelle Displaymanager zu ermitteln:

Code:
sudo systemctl status display-manager.service

Sodann ist der aktuelle Displaymanager zu rekonfigurieren. Das bedeutet, wenn gdm3 der aktuelle ist, dann muss der Befehl wie folgt lauten:

Code:
sudo dpkg-reconfigure gdm3

Danach kommt ein Shelldialogfenster, in dem man dann aus einer Liste von installierten Displaymanagern den gewünschen auswählen kann.

Ein Neustart ist danach notwendig, damit der neue Displaymanager aktiviert werden kann. In der virtuellen Maschine war zunächst nur ein schwarzer Bildschirm zu sehen. Das war dann nicht so schön. Aber nachher kam dann doch die richtige Anzeige

Drucke diesen Beitrag

  Wenn man SQLite3 erlernt II
Geschrieben von: Joopi - 11-01-2023, 08:52 - Forum: Programmieren - Keine Antworten

SQLite3 könnte im Laufe der Zeit für mich wichtig werden. Ich möchte ja nicht unbedingt mit MySQL oder MariaDB arbeiten. SQLite3 ist schlank und kann, wenn gewünscht, mit anderen Programmen verarbeitet werden.

Auch kann ich mir vorstellen, dass ich mit Shellscripten eine Verbindung zu SQLite3-Datenbanken herstellen kann.

  • Eine Dokumentation zu SQLite3 liegt hier](file:///usr/share/doc/sqlite3-doc/index.html)
  • Eine Dokumentation von SQL liegt hier](file:///usr/share/doc/sqlite3-doc/lang.html)
  • Eine Dokumentation der Client-Befehle, für mich die wichtigen Angaben, liegt hier](file:///usr/share/doc/sqlite3-doc/cli.html)
  • Eine weitere Dokumentation ist hier zu finden](https://sqlite.org/cli.html)
  • <https://sqliteonline.com/>
  • <https://www.php.net/manual/de/ref.sqlite.php>
  • <https://riptutorial.com/de/php/example/27461/sqlite3-schnellstartanleitung> - sehr gut, hat geholfen die Anzahl auszuwerten
  • <http://www.hackingwithphp.com/9/7/3/getting-started-with-sqlite-3> - in englischer Sprache, aber sehr, sehr gut!!!!!!!

In der Handhabung von SQLite gibt es zwischen den verschiedenen Plattformen doch einige Unterschiede.

Um über den Export-Befehl eine Tabelle als CSV-Datei zu exportieren, sind folgende Zeilen notwendig:

Code:
sqlite> .header on 

Code:
sqlite> .mode csv 

Code:
sqlite> .once /home/django/help/help3/dataout.csv 

Code:
sqlite> select * from users; 

Code:
sqlite> .system xdg-open /home/django/help/help3/dataout.csv

Der letzte Befehl öffnet im Grunde genommen ein Importfenster aus LibreOfficeCals, legt aber auch die entsprechende Datei an (in Mac heißt das open, unter Windows ist nichts anzugeben).

Um die ganze Datenbank zu sichern, ist folgender Befehl außerhalb von SQLite, also auf der Konsole am Prompt, einzugeben (im Beispiel ist das aktuelle Verzeichnis auch das Datenbankverzeichnis):

Code:
sqlite3 users.sqlite .dump | gzip -c >/home/django/help/help3/users.dump.gz

Eine Datenbank ist recht einfach auf der Konsole zu erstellen. Es ist jedoch wichtig zu wissen, dass eine gänzlich leere Datenbank sofort wieder gelöscht wird. Daher ist es ratsam, sofort im Anschluss, wenn man die Datenbank halten will, eine Tabelle anzulegen. Damit ist gewährleistet, dass die Datenbank aktiv bleibt und vorhanden ist.

Die Definition von Tabellen ist im Grunde genommen relativ einfach, da es keine expliziten Datentypen wie bei MySQL gibt. Eine Datumsangabe wird als String erfasst und sollte die Syntax JJJJ-MM-TT haben.

Eine Ausnahme bildet die Möglichkeit bzw. die Notwendigkeit, einen Primärindex zu schaffen. Dieser wird wie folgt definiert: integer primary key

Wenn ich also, wie ich es gewohnt bin, eine ID als Autowert in dieser Tabelle haben, so muss ich bei der Anlage der Tabelle, am besten wie immer zu Beginn, diese definieren: **id integer primary key**

Soweit ich das verstanden habe, muss die ID nicht mit angegeben werden, sondern bei der Erfassung eines Datensatzes zählt SQLite3 den Autowert selber hoch.

CSV-Daten importieren

Der Import über eine CSV-Datei ist relativ einfach.

Der Aufbau der CSV-Datei ist wie der Export einer Tabellenabfrage und könnte wie folgt aussehen:

6,mailadresse@beispiel.com,Vorname,"Beliebiger Text."

Innerhalb von SQLite3, also in der aktiven Datenbank, ist dann folgendes einzugeben:

Code:
sqlite> .mode csv 

Code:
sqlite> .import datain.csv mails

In der CSV-Datei sollte die erste Zeile, sofern sie die Feldnamen beinhaltet, gelöscht werden.

fetchAssoc() und fetchArray()

Als weitere wichtige Information habe ich folgendes gefunden:

Zitat:Finally, note that there is no fetchAssoc() method at this time, so SQLite's fetchArray() method is used, specifying SQLITE3_ASSOC as parameter two. If you do not do this, fetchArray() will return each field of data twice - once with its numeric index, and again with its field name string index.

Das bedeutet für mich, dass SQLite3 nur mit fetchArray() arbeitet, aber kein fetchAssoc() kann.

Abfrageresultate zeigen

Die Ausgabe einer Select-Anweisung ist immer noch das spannedste Thema und bringt mich immer wieder in Bedrängnis.

Das nachfolgende Beispiel für die Ausgabe einer Auswertung ist aus einem anderen Erklärungsanlass, zeigt aber die grundelegende Bedeutung des Ganzen:

PHP-Code:
<?php
    $db
->createFunction("EXISTS_IN_BOTH""ExistsInBoth");

    $result $db->query("SELECT Name FROM employees WHERE EXISTS_IN_BOTH(Name)");

    while($row $result->fetchArray($querySQLITE_ASSOC)) {
        extract($row);
        print "$Name is in both databases\n";
        }
?>

Es geht nur um den Teil nach der Query-Auswertung, wo mit while die Ausgabe angestoßen wird. Hier ist zu bedenken, dass scheinbar die Syntax für SQLite genutzt wurde. Ich arbeite aber mit SQLite3.

Ich habe den Code also versucht an SQLite3 anzupassen und folgenden funktionierenden Programmcode erhalten:

PHP-Code:
<?php
    
/* Datenbankdatei öffnen bzw. erzeugen */
    $db = new SQLite3("mailbox.db");

    /* Drei Datensätze eintragen */
    $res $db->query("SELECT * FROM mails");

    /* Ausgabe der Daten in einer Schleife */
    while($row $res->fetchArray(SQLITE3_ASSOC)) {
        extract($row);
        //print "$name als Test\n";
        echo "<p>Das ist der Name: " $id "</p>";
        echo "<p>Das ist der Name: " $mailaddi "</p>";
        echo "<p>Das ist der Name: " $name "</p>";
        echo "<hr>";
    }

    /* Verbindung zur Datenbank wieder lösen */
    $db->close();
?>

Im Parameter von fetchArray darf nicht das Wort query stehen und es ist naürlich SQLITE**3**_ASSOC.

Das Datum ist auch so eine Sache für sich

Bei der Erfassung von Datensätzen ist es angebracht, Zeitstempel zu setzen. Bei MySQL ist das mit now() recht einfach.

Diese Funktion gibt es bei SQLite anscheinend nicht, aber es gibt eine Variante, die funktioniert:

Code:
insert into test (partner,erfasst, geaendert) values ("Margot", datetime('now'), datetime('now'));

Die Ausgabe über SELECT ist dann wie folgt:

Zitat:2,Margot,"2020-04-02 15:42:20","2020-04-02 15:42:20"

Leider wird die UTC-Zeit gesetzt und nicht die lokale Zeit. Das Zeitformat datetime('localtime') hat nicht funktioniert.

Die beiden Datumsfelder müssen nicht zwingend als solche definiert werden. Das ist bei SQLite3 sowieso eine Sache, die ich noch nicht so ganz verstehe, da ich im Internet Artikel finde, die eine Deklaration von Datentypen bei der Erstellung von Tabellen zeigen.
  • DATETIME() zeigt später das Datum und die Uhrzeit.
  • DATE() hingegen zeigt nur das Datum.
  • TIME() zeigt nur die Uhrzeit, die wohl immer als UTC bzw. GMT gezeigt wird. Man soll später bei der Auswertung entsprechend umstellen.

Eine mögliche Lösung

Um das Problem zu beheben, da scheinbar nicht über localtime erfasst werden kann, ist es, bei der Ausgabe der Datensätze das Feld bzw. die Felder, die Zeitangaben beinhalten, auf die lokale Zeit umzurechnen.

Das kann so erfolgen:

Code:
select datetime(erfasst, 'localtime') from test1;

Die Angabe der Zeitzone CET funktioniert in diesem Zusammenhang leider nicht.

Die Lösung!!!

Entgegen der Annahme, dass es mit localtime nicht geht, habe ich es geschafft.

Datensatzerfassung:

Code:
insert into test1(name, erfasst, geaendert) values ("Vera", datetime('now'), time('now', 'localtime'));

Resultat bei der Abfrage:

Zitat:3|Vera|2020-04-02 16:10:58|18:10:58

Der erste Eintrag ist die normale Zeit, also UTC, der zweite Eintrag ist im Grunde genommen die CET-Zeit, also mein lokale Zeit. Damit weiß ich, wie ich Zeitangaben regeln kann.

Im Internet gibt es Stimmen, die sagen, dass man das nicht machen soll, sondern eben bei der Datenausgab, wie vorher beschrieben, eine Umrechnungen machen soll.

Das Einfügen von Werte über Variablen birgt Fallen und Tücken.

Ich hatte das Problem, dass zwar Datensätze in der Tabelle enthalten waren, aber diese bei der Auswertung über ein PHP-Script nicht angezeigt wurden.

Nach langem Suchen habe ich festgestellt, dass ich die Werte mit einer Variablen in die Tabelle schreiben, die in Hochkommata gesetzt war. Somit sind die Werte als Strings erfasst worden und die als Integer-Werte. Nachdem ich die Werte via UPDATE mehr oder weniger neu erfasst habe, über die Konsole habe ich das gemacht, wurden die Datensätze bei der Selektion auch angezeigt.

Somit muss das INSERT-Statement wie folgt aussehen:

PHP-Code:
<?php
    $db
->query($sqlstr"('$n1', $n2$n3, '$n4', datetime('now', 'localtime'), datetime('now', 'localtime'))");
?>

Die Variablen $n2 und $n3 werden ohne Hochkommata eingebaut und sollten somit Zahlenwerte beinhalten.

Update am 27.05.2020**

Will man in einer SQLite3-Tabelle nachträglich einen primary key einfügen, so ist das nicht möglich. Es geht einfach nicht.

Stattdessen muss man die betroffene Tabelle umbenennen, eine neue Tabelle mit dem primary key erstellen (mit dem alten Namen) und dann die Daten von der umbenannten Tabelle in die neue Tabelle zu kopieren.

Das geht wie folgt:

Tabelle ohne primary key umbenennen:

Code:
ALTER TABLE datentabelle RENAME TO datentabelle_alt;

Neue Tabelle mit pirmary key erstellen:

Code:
CREATE TABLE datentabelle (id primary key, vorname, nachname);

Daten der umbenannten Tabelle in die neu erstelle Tabelle kopieren:

Code:
INSERT INTO datentabelle (id, vorname, nachname) SELECT id, vorname, nachname from datentabelle_alt;

Die alte, also umbenannte Tabelle nach Prüfung löschen:

Code:
DROP TABLE datentabelle_alt;

Damit ist das Feld **id** mit einem primary key belegt.

Für den normalen Gebrauch

Folgende Vorgänge muss ich auf der Konsole lernen und beherrschen:
  • Datenbank anlegen
  • Tabelle anlegen
  • Daten erfassen
  • Tabellenstruktur ansehen (Welche Felder gibt es?)
  • Tabelle ändern (ALTER)
  • Tabelle auswerten (SELECT)
  • Datensatz löschen (DELETE)
  • Datensatz ändern (UPDATE)

Update am 12.06.2020

Für die Darstellung der im Jahr gefahrenen Kilometer hole ich die Daten aus einer Datenbank. Leider geht das nicht mehr so wie in MySQL, sondern ich musste nun andere Wege finden.

Um Jahressummen der gefahrenen Kilometer zu erhalten, musste ich wiederum das Jahr aus dem Tag der Tour ermitteln. Das geht so:

Code:
strftime('%Y', tag)

Das ist das SQL-Statement zur Abfrage:

PHP-Code:
<?php
    $data 
$db->query("select strftime('%Y', tag) as Jahr, sum(km) as KM from $tblname109 group by strftime('%Y', tag) order by strftime('%Y', tag) desc");
?>

%Y steht für eine vierstellig formatierte Jahreszahl. tag ist das Feld in der Tabelle für das Datum der Radtour. strftime ist die Funktion, um die Jahreszahl aus dem Datum heraus zu holen.

Die Syntax für die Summierung der Kilometer je Jahr wurde so in der Form anstandslos akzeptiert.

Aber auch die Ausgabe der Ergebnisse musste umgebaut und an SQLite3 angepasst werden:

<?php
    while($r = $data->fetchArray(SQLITE3_ASSOC))
    {
        echo var_dump($r);
        echo "<tr>";
        echo "<td>" . $r["Jahr"] . "</td><td>" . $r["KM"] . "</td>";
        echo "</tr>";
    }
?>

Zuvor hatte ich die Variable $r durch einen var_dump ausgeben lassen und somit wusste ich, welche Feldnamen ich aus dem Array über übernehmen hatte - nämlich die über as neu definierten Feldnamen.

Die Radtourliste als auch das Erfassungsformular sind damit wieder einsatzbereit.

Drucke diesen Beitrag

  SQLite3 using with PHP
Geschrieben von: Joopi - 11-01-2023, 08:34 - Forum: Programmieren - Keine Antworten

Im Intranet3, dem Testcenter, habe ich verschiedene PHP-Code-Schnipsel zur Verwendung von SQLite3 getestet, um sie später mal in meinen Scripten zu verwenden. Da ich diese Schnipsel noch zu Zeiten vn PHP5.x getestet hatte, muss ich nun die Funktionalität i.V.m PHP7.4x überprüfen und ggfs. neu lernen.

Prüfung, ob Datenbank vorhanden ist**

PHP-Code:
<?php
    
//das Ausrufezeichen negiert die Abfrage, also kann ich nach dem ELSE den Programmcode fortsetzen und habe immer    SQLite3 vor Augen
    if(! extension_loaded("sqlite3")) 
        echo "<p>sqlite3-Bibliothek nicht vorhanden</p>";
    else
        echo "<p style=\"background-color: silver; \">sqlite3-Bibliothek vorhanden</p>";
?>

Diese Variante ist negiert, damit im postiven Falle in der ELSE-Verzweigung der eigentliche Programmcode ablaufen kann. Es macht Sinn, nach dem Feststellen eines Fehlers, alles abzubrechen und eine Fehlermeldung auszugeben. So sollte ich künftig alle meine Programm aufbauen, damit ich weiß, ob das Programm überhaupt läuft.

Eine Datenank anlegen

PHP-Code:
<?php
    $db 
= new SQLite3("sq3.db");
?>

Existiert die Datenbank bereits, so wird sie geöffnet und der Cursor steht am Prompt.

Existiert die Datenbank noch nicht, wird sie erstellt und der Cursor steht am Prompt. Wird allerdings in der Datenbank nicht mindestens eine Tabelle erstellt, so wird die Datenbank(-datei) beim Verlassen nicht gespeichert. Die Datenbank existiert dann nicht.

Eine Tabelle anlegen

PHP-Code:
<?php
    $db
->exec("create table personen (id integer primary key, name, vorname, personalnummer, gehalt, geburtstag);");
?>

Es werden keine expliziten Datentypen mitgegeben. Nur der primary key wird gesetzt und ist ein auto_increment.

Die Datenbank abfragen

PHP-Code:
<?php
    
/* Datenbankdatei öffnen bzw. erzeugen */
    $db = new SQLite3("sq3.db");

    /* Datenbank abfragen */
    $res $db->query("select * from personen");

    echo "<table>";
    echo "<tr><th>Name</th><th>Vorname</th><th>P-Nr.</th><th>Gehalt</th><th>Geburtstag</th></tr>";

    /* Abfrageergebnis ausgeben */
    while($dsatz $res->fetchArray(SQLITE3_ASSOC))
    {
        echo "<tr>";
        echo "<td>" $dsatz["name"] . "</td>";
        echo "<td>" $dsatz["vorname"] . "</td>";
        echo "<td>" $dsatz["personalnummer"] . "</td>";
        echo "<td>" number_format($dsatz["gehalt"], 2',''.') . "</td>";
        echo "<td>" $dsatz["geburtstag"] . "</td>";
        echo "</tr>";
    }
    echo "</table>";

    /* Verbindung zur Datenbank wieder lösen */
    $db->close();
?>

Drucke diesen Beitrag

  Wenn man SQLite3 erlernt I
Geschrieben von: Joopi - 11-01-2023, 08:27 - Forum: Programmieren - Keine Antworten

In diesem Artikel möchte ich die grundlegenden Befehle für die Admininstration und Verwendung von SQLite3 auf der Konsole zeigen.

Im Gegensatz zu meinem bisherigen Wissen, können durchaus Datentypen bei der Erstellung einer Tabelle mitgegeben werden:

Code:
sqlite> CREATE TABLE images(name TEXT, type TEXT, img BLOB); 
sqlite> INSERT INTO images(name,type,img) 
  ...>  VALUES('icon','jpeg',readfile('icon.jpg'));

Das sind wichtige Seiten im Netz, um etwas über die Syntax zu erfahren:

https://sqlite.org/cli.html

Datenbank anlegen

Eine Datenbank kann in der Konsole wie folgt angelegt werden:

Code:
sqlite3 dbname.db

Existiert die Datenbank bereits, so wird sie geöffnet und der Cursor steht am Prompt.

Existiert die Datenbank noch nicht, wird sie erstellt und der Cursor steht am Prompt. Wird allerdings in der Datenbank nicht mindestens eine Tabelle erstellt, so wird die Datenbank(-datei) beim Verlassen nicht gespeichert. Die Datenbank existiert dann nicht.

Eine Tabelle anlegen

Code:
create table personen (id integer primary key, name, erfasst, geaendert);

Es werden keine expliziten Datentypen mitgegeben. Nur der primary key wird gesetzt und ist ein auto_increment.

Einen Datensatz erzeugen/einfügen

Code:
insert into tbname (name, erfasst, geaendert) values ("Vera", datetime('now'), time('now', 'localtime'));

Die Datums- und Uhrzeitmitgabe ist auch in SQLite3 möglich.

Die Datenbank abfragen

Code:
select * from tbname where id = 1;

Die einfache Abfrage über eine Tabelle funktioniert in SQLite3 analog zu MySQL

Einen Datensatz löschen

Code:
delete from tbname where id = 1;

Einen Datensatz ändern

Code:
update tbname set position = "Abteilung WHERE position = "Abt";

Die Anzahl von Datensätzen abfragen**

Code:
select count(distinct "personalnummer") FROM "personen";

Eine Summe bilden

Code:
select sum(distinct "gehalt") FROM "personen";

Was ist vorhanden?

Eine SQLite3-Datei enthält nicht nur eine Datenbanken, sondern kann mehrere Datenbanken mit den jeweiligen Tabellen enthalten. Hier die wichtigsten Systembefehlte, um zu prüfen, was alles enthalten und wie es aufgebaut ist:
  • Datenbank = .databases
  • Tabellen = .tables
  • Tabellenstruktur = .schema tbname

Hilfen in der Konsole
  • Spalterüberschriften zeigen = .headers on
  • Anzeige/Ausgabe der SELECT-Ergebnisse = .mode formatname

Zitat:The sqlite3 program is able to show the results of a query in eight different formats: "csv", "column", "html", "insert", "line", "list", "quote", "tabs", and "tcl". You can use the ".mode" dot command to switch between these output formats.

Diese Ausgabeformate können am Bildschirm, aber auch zur Ausgabe in eine Datei gesetzt werden.

Import von Daten aus CSV-Datei

Code:
.import /home/django/help/somedata.csv tbname

Dies ersetzt wahrscheinlich nicht die vorherige Erstellung der Tabelle, in die die Daten importiert werden sollen.

Im DB-Browser kann ich Tabellen-Exporte als csv-Datei importeren, wobei dann die Tabelle angelegt wird (ohne Datentypen und ohne primary key).

Tabellen verknüpfen mittels JOIN

Das sind die beiden Tabellen in einer Datenbank:

Code:
sqlite> create table artikel (id integer primary key, titel, user_id);

Code:
sqlite> create table user (id integer primary key, name);

Das sind die eingefügten Werte in den beiden Tabellen:

Code:
sqlite> insert into artikel (titel, user_id) values ("Der Mond", 1);
sqlite> insert into artikel (titel, user_id) values ("Die Sonne", 2);
sqlite> insert into artikel (titel, user_id) values ("Das Universum", 1);
sqlite> insert into artikel (titel, user_id) values ("Fischwelten", 3);
sqlite> insert into artikel (titel, user_id) values ("Schlangenfarm", 3);
sqlite> insert into user (name) values ("Hermann");
sqlite> insert into user (name) values ("Burkhard");
sqlite> insert into user (name) values ("Robert");

Und das ist das SQL-Statement zum JOIN der beiden Tabellen:

Code:
select a.titel, u.name from artikel a inner join user u on a.user_id = u.id where u.id = 3;

Zum Glück ist hier die gleichen Syntax gegeben wie bei MySQL, daher kann ich ggfs. das Jagdzentrum auf SQLite umstellen und die Bilderausgabe direkt aus dem Ordner bewerkstelligen.

Update 30.05.2020 - 21:15 Uhr

Das Thema mit der Erfassung von Datum und Uhrzeit (Uhrzeit lokal) ist so eine Sache für sich. Es gibt verschiedene Möglichkeiten, die unter aufgelistet sind (die letzte ist die beste):

Code:
sqlite> insert into test2 (name, erfasst, geaendert) values ("Vera", datetime('now'), time('now', 'localtime'));

Code:
sqlite> .headers on

Code:
sqlite> select * from test2;
id|name|erfasst|geaendert
1|Vera|2020-05-30 19:10:50|21:10:50

Code:
sqlite> insert into test2 (name, erfasst, geaendert) values ("Helga", date('now'), time('now', 'localtime'));

Code:
sqlite> select * from test2;
id|name|erfasst|geaendert
1|Vera|2020-05-30 19:10:50|21:10:50
2|Helga|2020-05-30|21:12:38

Code:
sqlite> insert into test2 (name, erfasst, geaendert) values ("Irma", date('now'), datetime('now', 'localtime'));

Code:
sqlite> select * from test2;
id|name|erfasst|geaendert
1|Vera|2020-05-30 19:10:50|21:10:50
2|Helga|2020-05-30|21:12:38
3|Irma|2020-05-30|2020-05-30 21:13:21

Bei der letzten Variante im Feld geaendert wird das Datum und die lokale Uhrzeit ausgegeben. Für die Nutzung ist diese Art wohl die beste, denn bei Änderungen wird eh nur das Feld geaendert mitgegeben, bei einer Neuanlage eines Datensatzes werden beide Felder angesprochen.

Drucke diesen Beitrag

  convert bild resize
Geschrieben von: Joopi - 11-01-2023, 08:16 - Forum: Programmieren - Keine Antworten

Auf der Konsole ist es möglich, Bilder in der Größe zu verändern. Oftmals will man die Bilder verkleinern.

Sind viele Bilder zu verändern, macht es Sinn, wenn dieses im Stapel mittels eines Shell-Scripts erfolgt. Die Ausgabe der veränderten Bilder sollte nach Möglichkeit in einem neuen Ordner erfolgen.

Der einfache Befehl lautet wie folgt:

Code:
convert -resize 1024x768 bild.jpg

Man kann auch mit dem Sternchen als Wildcard arbeiten, jedoch werden die Bilder dann neu erstellt und neu nummeriert. Das finde ich nicht ganz so gut. Der Befehl ist wie folgt:

Code:
convert -resize 1024x768 *.jpg

Einfacher scheint es zu sein, wenn man viele Bilder mit einen kleinen Script abarbeitet. Dieses könnte wie folgt aussehen:

Code:
for bild in *.jpg
do
convert -resize 800x600 $bild ./kleiner/$bild
done

Hier werden im Ausführungsordner die vorhandenen JPG-Bilder auf eine Größe von 800x600 Pixeln verändert und im Unterordner kleiner gespeichert.

Eine prozentuale Veränderung des Bildes ist auch möglich. Der Befehl dazu sieht wie folgt aus:

Code:
convert -geometry 20x20% bild.jpg bild_klein.jpg

Das Konvertieren in ein anderes Bildformat ist auch möglich. Der Befehl dazu sieht wie folgt aus:

Code:
convert -resize 1024x768 bild.jpg bild.png

Ich kann das Script sehr gut dafür verwenden, wenn ich Bilder von meinen Radtouren auf dem WordPress-Blog veröffentlich will, aber nicht die sehr großen dafür benutzen möchte. Es reichen Verkleinerungen auf 60 % der Originalgröße.

Drucke diesen Beitrag

  Openshot Grundkenntnisse
Geschrieben von: Joopi - 11-01-2023, 08:10 - Forum: Linux - Antworten (1)

Mit OpenShot habe ich derzeit die Gelegenheit, meine Filme mit einfachen Dingen zu verarbeiten. Folgendes kann ich nun machen:

  • Szenen extrahieren (rechts und/oder links abtrennen)
  • Teilstücke zu einem Film zusammenfassen
  • Untertitel einfügen (PNG-Bilder mit transparentem Hintergrund und Text oder mit farbigem Hintergrund)
  • Audiospur abtrennen
  • Audiodatei als Nachvertonung einfügen

Beim Einfügen eines Untertitels muss beachet werden, dass dieser als erste Spur verwendet wird. Ansonsten flackert und flimmert der Untertitel. Die Grafik kann durchaus kleingehalten werden, denn durch **Anordnen** kann der Datei mitgegeben werden, an welcher Position im Film diese angezeigt werden soll.

Update - Bild in Bild

Es gibt die Möglichkeit, dass ein Bild oder ein zweiter Film als transformiertes Element in einem Hauptfilm eingebaut wird. Der Nebenfilm steht dafür in Spur 4 und wird mit Anordnung entsprechend platziert. Über Transformieren kann man die Größe es Bildes bzw. Videos noch vorgeben. Entweder zu Beginn oder eben als herauszoomenden Effekt.

Update 04.02.2020 - Audio

Man kann in einem Film die Lautstärke regeln, und zwar bei den Eigenschaften. Dort steht standardmäßig eine 1. Ein Wert von 0,1 ist dann recht leise.

Will man einen Film, der eben eigenen Ton hat, nachvertonen, so kann man in den Sequenzen vor und nach der Toneinspielung die Lautstärke anpassen, also leiser stellen, oder eben auch ganz ausschalten. Bei der Kommentierung macht ein leises Hintergrundgeräusch vielleicht einen besseren Eindruck, weil es nicht so abrupt still wird.

Die einfache Variante ist, dass man die Lautstärke abrupt abregelt. Man kann es auch faden lassen, aber dazu kenne ich mich zu wenig aus.

Drucke diesen Beitrag

  Rechtevergabe
Geschrieben von: Joopi - 11-01-2023, 07:38 - Forum: Programmieren - Keine Antworten

Oftmals wird bei der Anlage einer Datenbank, die von einem Script genutzt werden soll, auch ein Benutzer gefordert. Zwar habe ich das schonmal dokumentiert, aber wohl doch nicht so gut wie es heute benötigt wird.

Die Anlage einer neuen Datenbank erfolgt so:

Code:
create database datenbankname;

Für die Anlage einer Datenbank habe ich eine gute Dokumentation gemacht, denn ich möchte verhindern, dass ich unbewusst eine Datenbank vom Typ InnoDB erstelle, sofern ich es vermeiden kann. Auch ist der Zeichensatz für mich wichtig.

Die Anlage eines neuen Benutzers erfolgt so:

Code:
create user "benutzername"@"%" identified by "passwort";

Nach dem der Benutzer angelegt wurde, muss man ihm die entsprechenden Rechte vergeben.

Die Rechtevergabe für den neuen Nutzer erfolgt so:

Code:
grant all privileges on datenbanname.* to "benutzer"@"%";

Drucke diesen Beitrag

  Hilfen zu Manjaro
Geschrieben von: Joopi - 11-01-2023, 07:03 - Forum: Linux - Keine Antworten

Vor etwa 2 Jahren trug ich mich mal mit dem Gedanken, ein Linuxdistribution zu nutzen, die dem Rolling-Release-Prinzip folgt. Es sollte Manjaro werden.

Die Paketverwaltung in Manjaro läuft nicht über APT oder APT-GET wie unter debian-basierte Distributionen, sondern über PACMAN.

Bis zur Aufgabe dieser Idee hatte ich ein paar grundlegende Hilfen zur Paketverwaltung aufgeschrieben, um nicht ganz so dumm darzustehen.

Das sind die wichtigsten Befehle in einem archbasierenden System wie Manjaro

Komplettes System aktualisieren

Code:
pacman -Syu

Pakete installieren
Code:
pacman -S <Paket> oder <Paket1 Paket 2>

Pakete deinstallieren
Code:
pacman -R <Paket>

Installation einer lokalen Datei
Code:
pacman -U <Paket-Dateiname>

Drucke diesen Beitrag

  LibreOffice im Vordergrund öffnen
Geschrieben von: Joopi - 11-01-2023, 06:58 - Forum: Linux - Keine Antworten

Wenn man Libreoffice startet, bleibt die Anwendung im Hintergrund.

Sobald über den Menüpunkt Zuletzt benutzte Dokumente eine Datei geöffnet wird, wird diese auch im Hintergrund geöffnet.

Das Öffnen einer LibreOffice-Datei aus dem Dateimanager heraus, ist auch so geregelt. Das kann man ändern, in dem man die Basis-Einstellungen für das Öffnen von Dokumenten ändert - und zwar wie folgt:

  • LibreOffice Writer öffnen
  • Menü “Extra” – “Optionen” anklicken
  • Eintrag “LibreOffice” – “Erweitert” wählen
  • Rechts unten Button „Experteneinstellungen öffnen“ klicken ins Suchfeld „ForceFocusAndToFront“ eingeben und auf suchen klicken
  • Eintrag „NewDocumentHandling“ markieren und unten auf Bearbeiten klicken

Der Wert des Eintrages sollte von false auf true wechseln.
Dann mit OK betätigen und LibreOffice (Writer und Calc) sollten die Dokumente nun auch im Vordergrund öffnen.

Leider ist die aktuell benutzte Version noch nicht mit einem Suchfeld ausgestattet, aber ich habe den Eintrag gefunden und angepasst.

Das Verhalten ist nun wie folgt:
  • Beim einfachen Start einer LibreOffice-Anwendung bleibt dieses wie bisher im Hintergrund
  • Das Öffnen aus dem Menüpunkt Zuletzt benutzte Dokumente erfolgt im Vordergrund
  • Das Öffnen aus dem Dateimanager heraus erfolgt im Vordergrund

Damit ist das Thema für mich gelöst. Vielleicht finde ich noch einen Hinweis darauf, wie man LibreOffice bzw. eine gestartete Anwendung, auch in den Vordergrund bekommt.

Drucke diesen Beitrag