Ubuntu Apache Webserver im lokalen Netzwerk verfügbar machen

Seit die Ubuntu Firewall (ufw) standardmäßig an ist, fiel auf, dass der Webserver im lokalen Netzwerk nicht mehr aufrufbar ist, sondern nur via localhost seine Schätze preisgibt.

Der Versuch in der Konfiguration des DocumentRoot Änderungen zu machen fruchtete auch nicht.

Es liegt einzig und allein an der Firewall, die man wie folgt öffnen kann, um die Einstellungen anzupassen:

$ sudo ufw app list

Verfügbare Anwendungen:
  Apache
  Apache Full
  Apache Secure
  CUPS
  OpenSSH
  Postfix
  Postfix SMTPS
  Postfix Submission


$ sudo ufw allow 'Apache'

Regel hinzugefügt
Regel hinzugefügt (v6)


$ sudo ufw status
Status: Aktiv

Zu                         Aktion      Von
--                         ------      ---
22/tcp                     ALLOW       Anywhere
Apache                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
Apache (v6)                ALLOW       Anywhere (v6)

Microsoft Teams – nervige Probleme durch Cache löschen lösen

In der aktuellen Zeit ist man ja gezwungen verstärkt mit Remote Collaboration Tools zu arbeiten. Die Klickibuntivariante glänzt durch die bekannten Probleme beim Synchronisieren zwischen Server- und lokalen Resourcen.

Leider funktioniert das selten und man muss auf der Konsole öfters die Caches weghauen:

// Anwendungen beenden
$ rm -rf ~/Library/Caches/com.microsoft.*
$ sudo rm /Library/Preferences/com.microsoft.teams.plist 

Daneben muss in der Anwendung auch regelmäßig (z.B. bei Veränderungen an Mailverteilern) der Cache gelöscht werden. Dazu:

  • rechte Maustaste auf dem Posteingangsordner
  • Eigenschaften -> Cache löschen

Happy hacking 🙂

Git: lokalen Stand zurücksetzen auf frisch ausgecheckten Zustand

Manchmal hat man ein lokal so fortgeschrittenes Projekt, dass man einfach mal auf den Stand zurückgehen will, den man hätte, wenn frisch ausgecheckt würde.
Das ist inbesondere sinnvoll, wenn man lokal viele Dateien – z.B. generierte Sachen oder Projekteinstellungen von IDEs – hat, die unter Umständen stören.

Ein:

$ git clean -fxd

putzt alles weg im Fall von Git.

SpringBoot – Controller erstellen mit JSON-Rückgabe und Standard-HTTP-code

Es ist einfach befreiend zu sehen wie einfach in einem SpringBoot-Umfeld die Webentwicklung ist:


@Controller
@RequestMapping("/foobar")
final class FooBarController {

@Inject
private FooBar fooBar;

/**
* @return the currently set {@link FooBar}.
*/
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity parseInvocationContext() {
return new ResponseEntity(fooBar.toString(), HttpStatus.OK);
}

}

Die Methode gibt mit einem 200er einfach ein Statusobjekt zurück und kann dieses ganz einfach als JSON anzeigen.

Schnelles Teilen von Dateien / lokaler Http-Server mit Python

Wenn man das Problem hat, dass Datenmengen geteilt werden sollen, die zu groß für FAT-formatierte USB-Sticks sind, braucht man einen kleinen HttpServer, damit man die Daten ganz einfach via
http://localhost:8000
herunterladen kann:

$ python -m SimpleHTTPServer 8000 (Python 2.x)
$ python -m http.server 8000 (Python 3.x)

Niemand will derlei Attachementbomben per Mail oder Onlinechat versenden 🙂

PHP7 – WOW-Effekt

Da mein Hoster nun final auf PHP7 umschwenkt, dachte ich mal für einige Domains testweise umzuschalten.

Erste kleinere Warnungen im selbstgeschriebenen PHP-Code fallen auf … im Netz findet man die gleichen „Problemchen“

  • Fatal error: 'break' not in the 'loop' or 'switch' context in /your/own/file.php on line 4711

aber krass ist der Performancevorteil.

Eine lokal auf PHP5.x laufende Seite – mit nur Datums/Zeitberechnung und sonst statischer Anzeige von Links – benötigt im Schnitt
Rendering took: 0.023338 s
auf PHP7 und im Webspace des Hosters läuft das Teil mit
Rendering took: 0.001340 s

Chapeau!

DB2 wieder eine besondere Datenbank

In der letzten Zeit durfte ich mit einer neuen relationalen Datenbank arbeiten. Nach langer Zeit mit dem Oracle dachte ich, dass die anderen Anbieter weniger besonders sind, aber dieses Tier hat es auch in sich.

  1. Die spärlich vorhandene Dokumentation des Herstellers mit den 3 Buchstaben ist schwer durchsuchbar und kaum suchmaschinenindiziert.
  2. Die Datenbank meldet Fehler in einer Form von Telefonnummern. Durch einen bestimmten JDBC-Verbindungsparameter
    jdbc:db2://ipOfDB2Host:50000/DB2_TEST:retrieveMessagesFromServerOnGetMessage=true;
    kann man auf Fehlermeldungen umschalten, die aber nur für wenige Fehler wirklich aussagekräftig sind:
    Internal Exception: com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.16.53] Batchfehler. Der Batch wurde übergeben, jedoch ist mindestens eine Ausnahmebedingung bei einem Einzelelement im Batch aufgetreten.
    2013/09/06 11:26:56.217 | Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte Elemente im Batch abzurufen. ERRORCODE=-4229, SQLSTATE=null
    2013/09/06 11:26:56.227 | Error Code: -4229
  3. Datenbanktabellen kommen intern in einen Status ‚Benötigt Reorganisieren‘ (Pending Reorganize). Das Recht Tabellen zu Organisieren hat man nicht automatisch, wenn man das ALTER TABLE-Recht hat. Welche Operation den Status auslöst, findet man hier.
  4. Entgegen dem Verhalten anderer Datenbanken kann man Indexe mehrfach anlegen – beim 1.Mal wird ein Index angelegt, bei allen anderen Malen das Kommando ohne Kommentar ignoriert. Stattdessen werfen andere Datenbanken Ausnahmen, denen man entnehmen kann, dass die Datenbankindexe bereits existieren.

Komisch, dass es die nicht vom Markt gefegt hat oder einfach durch eine freie Alternative ersetzt wurde wie H2 oder PostgreSQL

DB2 Pending Reorganize auf Datenbanktabellen – was ist der Auslöser für den Status?

Wieder mal ein DB2-Rätsel – welche Operationen führen dazu, dass die Tabelle in den ‚benötige Reorganisieren‘-Modus kommt?
Hintergrund ist, dass beispielsweise keine Indexe angelegt werden können, wenn die Tabelle ein reorg benötigt. Dazu muss man ein Spezialskript aufrufen.

Abhilfe schafft folgendes Beispielskript, das eine Tabelle FOO anlegt und nacheinander Änderungen vornimmt:

CREATE TABLE FOO (
ID INTEGER GENERATED ALWAYS AS IDENTITY NOT NULL,
METADATAKEY VARCHAR(255),
METADATAVALUE VARCHAR(255),
VERSION int
);
COMMIT;

select * from FOO;
insert into foo (METADATAKEY, METADATAVALUE, VERSION) values ('sch','asdasdasd','1');
select * from FOO;
COMMIT;

select indname, colnames from syscat.indexes where tabname = 'FOO';
select TABSCHEMA, TABNAME from SYSIBMADM.ADMINTABINFO where REORG_PENDING = 'Y';
COMMIT;

ALTER TABLE FOO ADD FORCE_REENTER_UMD SMALLINT DEFAULT 0 NOT NULL;
select TABSCHEMA, TABNAME from SYSIBMADM.ADMINTABINFO where REORG_PENDING = 'Y';
COMMIT;

ALTER TABLE FOO DROP FORCE_REENTER_UMD;
COMMIT;
ALTER TABLE FOO ADD FFORCE_REENTER_UMD SMALLINT DEFAULT 0 NOT NULL;
COMMIT;
select * from FOO;

CREATE INDEX INDEX_2COL_2GTHR ON FOO (METADATAKEY, METADATAVALUE);
select indname, colnames from syscat.indexes where tabname = 'FOO';
select TABSCHEMA, TABNAME from SYSIBMADM.ADMINTABINFO where REORG_PENDING = 'Y';
COMMIT;

Call Sysproc.admin_cmd ('reorg Table FOO');
COMMIT;

SELECT EJB.ID from FOO EJB;
COMMIT;

select TABSCHEMA, TABNAME from SYSIBMADM.ADMINTABINFO where REORG_PENDING = 'Y';
COMMIT;

DROP TABLE FOO;
COMMIT;

Interessant, dass ein Index anlegen die Änderung nicht zur Folge hat sondern das Löschen von Tabellenspalten. Hintergrund ist, dass es nicht auf allen relationalen Datenbanken ein Spalte umbenennen gibt. Daher wird man in manchen Situationen ein ALTER TABLE DROP COLUMN foo; machen und danach ein ALTER TABLE ADD COLUMN newFoo;.

Dateianzeige im Finder wie normal unter Linux

Wer erstmals an einem Rechner des Apfelherstellers arbeitet, findet es sicher auch verwirrend, dass man keine Einstellungsdateien sieht bzw. auch die Dateiendungen. Für die Konfigurationsdateien hilft folgender Aufruf in einem Terminal:

user@horst:~/ > defaults write com.apple.Finder AppleShowAllFiles TRUE
user@horst:~/ > killall Finder