Objective-C Metaprogrammierung: Blöcke zu Methoden
Die Ruby Welt verwendet Blöcke (Closures) liebend gerne für alles mögliche. Zum Beispiel als Builder-Methapher um Baumstrukturen (XML, GUI's, HTML, Tests) in der Sprache hinzuschreiben und dann nur noch in die Target-Sprache zu rendern.
Das sieht in Tests zum Beispiel so aus:
describe "something" do
it "should do fnord" do
someObject.should be_fnordy
end
end
Der Trick dabei ist das alles von do bis end jeweils ein Block ist der von der Methode describe oder it dann in eine UnitTest Klassenstruktur eingehängt wird um dann später als 'ganz normale' unit tests ausgeführt zu werden.
Jetzt wo Objective-C auch Blöcke unterstützt (ok, die können natürlich weniger als das Ruby Equivalent) müsste das eigenltich auch gehen - und siehe da mit Cedar gibt es auch schon einen ersten Versuch RSpec in Objective-C nachzubauen.
Well und daher habe ich mir mal angeschaut wie weit man denn kommt wenn man in Objective-C einen Block in eine Instanz-Methode umwandeln will.
Gleich vorneweg - das Typ-System von Objective-C macht mir hier einen kleinen Strich durch die Rechnung - ich habe es nicht geschafft einen Block nicht direkt als Funktions-pointer verwenden.
Aber mit etwas Umweg geht es doch.
Der Trick ist das Blöcke auch id's sein können, d.h. man kann sie bequem in ein NSMutableDictionary packen.
Also brauche ich auf meiner Klasse nur ein Dictionary, speichere die Blöcke darin mit dem Namen der Methode ab und baue mir einen generischen Dispatcher-IMP der den Selector (zweites unsichtbares Argument jeder Objective-C Methode) verwendet um den Block aus aus dem Dictionary zu ziehen und führe ihn dann einfach aus.
Die schönsten Testsuiten
Sowas wünsche ich mir auch mal für andere Programmiersprachen. Eine ständig aktuelle Hitliste der schönsten Testsuiten von Open Source software.
Sowas hier - aber systematisch und crowdsourced immer aktuell.
Hach, man kann träumen. :-)
Klarträumen
Klarträumen ist etwas das ich gerne lernen möchte und das mich derzeit beschäftigt. Erste Resultate habe ich schon - denn nach Jahren in denen ich mich vielleicht an einen Traum pro halbes Jahr erinnern konnte, erinnere ich mich jetzt an ein bis drei Träume pro nacht.
Stattlich. :-)
Sehr gut funktioniert für mich dass ich vor dem Schlafengehen via iPhone noch ein zwei YouTube Videos zu Klarträumen sehe um mich a) fortzubilden und b) mein Gehirn mit Klarträumen zu beschäftigen um die Warscheinlichkeit zu erhöhen dass ich mich an Träume erinnere (und später dass ich in einem Traum merke dass ich träume).
Eine super Einführung finde ich nach wie vor Reece Jones 2, 3, aber auch andere Videos von ihm sind interessant (gleiten allerdings recht schnell in viel zu esoterische Gefilde ab für meinen Geschmack).
Abends (und morgens bevor ich noch einmal zum Träumen einschlafe) verwende ich momentan zur Beschäftigung mit meinem Träumen die Videos von Lucidipedia die zwar etwa länglich, dafür aber gut verständlich und sehr Detailreich gute Tips zum Träumen geben. Besonders gefallen mir daran die vielen Beispiele die er gibt und die Art wie er sie erklärt.
Noch ein paar Webseiten:
Aber auch eine einfache YouTube Suche bringt erstaunlich viele Ergebnisse.
jQuery editInPlace
Well, I just finished some major reworking of that jQuery plugin, so now it has a real testsuite and conforms to the jQuery Plugin Guidelines and doesn't pollute the core prototypes (of String) anymore.
There are a few new features, most prominent the ability to define a class to apply for the hover effect (so you can style the hover in css instead of having to hand in the colors directly and more control over the way errors are presented so it is easier to embed into bigger applications.
So enjoy the demo and the download while they are hot, and keep a bookmark to the project homepage. :)
Stuff I'd like to note:
- JSpec rocks, writing tests with it is a breeze. The DOM Testrunner they have could use some work though to become even more usefull
- Writing the tests with no dom insertion is a _great_ technique to get a fast testsuite where you can almost guarantee that it has no test-ordering issues.
- jQuery allows you to almost completely drive the interaction with the editor as a user would, making it almost like an acceptance test (and with very little dependency on the internal working of the editor.
- Refactoring JavaScript Code is hard if you don't have a testsuite. My Advice: Break it down into smaller bits. I found it incredibly hard to refactor larger pieces of the code, as not having a testsuite means there's no way you know what still works. :/
Wo findet Innovation beim Lehren statt?
Früher mal dachte ich, dass das ja in den Universitäten sein muss. Schließlich ist da alles auf einem fleck. Forscher und Lehrer und Schüler.
Optimale Bedingungen eigentlich - nur dass dort an der Lehre überhaupt nicht geforscht wurde. Schließlich war das ja nur ein Anhängsel das Zeit kostet. Kein Forschungsgebiet.
In der Schule natürlich sowieso nicht und danach?
Im Beruf?
Ich bin natürlich mein eigenes Forschungssubjekt, weil ich weiter lerne und das beobachte. Und für mich selber ist es natürlich so dass ich ständig mit Innovationen habe, durch meine Möglichkeit das Netz zu verwenden.
Aber ab und an trifft man auf etwas großartiges. In einem Interview von John Udell bin ich auf die Khan Academy gestoßen.
Das ist ein Mensch der seine Erfüllung darin findet dass er kurze Videos (~10 Minuten lang) aufnimmt in denen er eine Sache - ein Konzept aus Mathematik, Physik, Chemie, Finanzen und vielen weiteren Themen.
Und die sind gut!
Ausserdem hat er eine Software online gestellt die ein sehr spannendes Konzept verfolgt: Wissen ist dort als Graph aufgestellt - von einfachster Addition bis zu relativ komplexen Themen. (Aber viel weniger als als Video verfügbar ist).
Der Clou: Man fängt bei einfacher Addition an und kriegt die nächst-Schwierigeren Aufgaben erst wenn man 10 Aufgaben aus einem Wissensgebiet erfolgreich direkt hintereinander gelöst hat.
Dazu gibt es jeweils den ganzen Lösungsweg plus einen Link auf das dazugehörige Video wenn man es noch mal im Detail braucht.
Das führt dazu dass Kinder gerade bei Mathe ihre Lücken auffüllen können die sie irgendwo im Verständnis haben. Und das finde ich Großartig - denn das ist eines der größten Probleme von Großgruppen-Lernen. Wenn ein Thema vorbei ist, dann ist es vorbei - egal ob man es verstanden hat oder nicht.
Verdammt schade dass es noch soo lange dauern wird bis solche Konzepte auch in der "Offiziellen" Lehre angekommen sind.
Gletscher Rückzug
Klima-Veränderung ist ein schwer zugängliches Thema.
Aber auch Sau-Wichtig. Und daher finde ich es grandios was James Balog für eine Arbeit gemacht hat um den Gletscher-Rückzug zu dokumentieren. Mit knapp 30 Zeitraffer-Kammeras macht er über Jahre Hinweg jede Stunde ein Bild von vielen Gletschern und daraus dann einen Film.
Wow.
- Gibts bei TED als Video
- Oder auf der Homepage des Projekts
- Mein Lieblingsvideo dort bisher
100 mal Floss Weekly
:) Einer meiner Lieblingspodcasts hat es jetzt auf die 100. Ausgabe gebracht.
Und da muss ich doch mal gratulieren. Vor allem weil ich bei der Quiz-Show über Programmiersprachen und deren Verbreitung absolut herzhaft gelacht habe. :-)
Hörenswert! Immer wieder großartige Interviews mit Machern von Open Source Projekten.
[Hier gehts zur 100-sten Show http://twit.tv/floss100]
Softwareentwicklung als Kooperatives Spiel
Das ist ein steinalter Vortrag von Alistair Cockburn (gesprochen Co-Burn) in dem er darlegt wieso er findet das das eine sehr gute Sichtweise auf Softwareprojekte ist.
Der Vortrag ist schon 10 Jahre alt - und trotzdem finde ich ihn sehr Aktuell.
Lesenswert!
Python Saug Punkte contd.: x += y ist nicht x = x + y
a = b = list() a = a + ['foo'] print b # => [] a = b = list() a += ['foo'] print b # => ['foo']
Doh. Wie kann das sein? Kommt man von C ist das erst mal sehr verblüffend - und auch die meisten anderen Programmiersprachen die ich kenne verwenden a += b als equivalent für a = a + b.
Well, nicht so Python. Weil da gab es offenbar mal Programmierer die fanden dass man Code der mit Matrizen rechnet lieber mit Operatoren schreiben möchte weil sich das besser ließt. Natürlich nicht mit den normalen operatoren wie */+-, weil, da kann man ja den empfänger nicht in place modifizieren, und wie jeder weiß sind Matrizen ja so groß dass die dann nicht mehr in den Ram passen.
Also haben sie die <op>= operatoren in Python so spezifiziert, dass sie ihre left-hand-variable in place modifizieren wenn diese mutable sind.
:-(
Python Saugpunkte: Klassenobjekte
Klassenobjekte sind special - daher hat man im boddy einer klasse keinen Zugriff auf das klassenobjekt.
Weil, self ist ja auch nicht automatisch und man muss es in Methoden immer als explizites Argument hinschreiben, und so etwas gibt es ja bei Klassen nicht, denn das sind ja keine Methoden und daher kann man halt das Klassenobjekt nicht referenzieren im body.
Doh.
Und das nervt natürlich total bei der meta-programmierung.
Hier mal ein Beispiel von etwas SQL-Alchemy Code wo mir das wieder aufgefallen ist:
class Poll(Base):
proposal = relation(proposal.Proposal, backref=backref('polls', cascade='all',
lazy=False, order_by=Poll.begin_time.desc()))
Das geht nicht, weil ich auf Poll nicht zugreifen kann und damit nicht auf andere attribute der Klasse. Der Workaround den SQLAlchemy dafür macht ist das man einen String hineinreicht und die den dann aufwendig parsen. Total gar nicht toll.
:-(
Grand Unified Theory of Programming?
Das höchste Ziel in der Physik ist alle Kräfte durch eine Formel auszudrücken bzw. sie in Beziehung zueinander zu setzen. Maxwell zum Beispiel gelang das für elektrische und magnetische Felder - und dafür ist er noch heute berühmt.
In der Software-Entwicklung gibt es so etwas bisher nicht. Klar, es gibt Daumenregeln, so wie:
- Keep it DRY
- Keep your Methods Small **
- Work SOLID
- Obay the Law of Demeter
- und so weiter…
Aber, und das ist der wichtige Teil: diese Daumenregeln sind keine Unifikation die die verschiedenen Probleme beim Programmieren abwägen und in Beziehung setzen.
Daher finde ich Jim Weirichs Vortrag The Building Blocks of Modularity sehr spannend - denn da stellt er den Ansatz der Connascence vor (ab Folie 35).
Das ist letztlich eine Klassifizierung welche Art von Abhängigkeit man sich durch welche Programmiertechnik einfängt - und damit kann man 'normales' Refactoring anwenden um von problematischeren Connascence's (?) zu weniger problematischen zu kommen.
Ach ja, ursprünglich kommt das aus dem Buch What every Programmer should know about Object Oriented Design. Davon kann man aber Getrost nur noch den dritten Teil lesen (über Connascence) - der rest ist nach 15 Jahren einfach veraltet. :)
** Niemand sagt das so gut wie Kent Beck: "Lots of little pieces - Good code invariably has small methods and small objects. Only by factoring the system into many small pieces of state and function can you hope to satisfy the “once and only once” rule. I get lots of resistance to this idea, especially from experienced developers, but no one thing I do to systems provides as much help as breaking it into more pieces."
Python Saug Punkte contd.
Eine Sache die mich bei Python immer wieder ärgert ist die Tatsache dass Standardwerte für Methodenargumente zur Parsezeit festgelegt werden anstatt zur Aufrufzeit.
Das ist total doof, denn dadurch teilen sich alle aufrufe der Funktion den gleichen default-wert - was zwar schön schnell sein mag, aber trotzdem in fast allen Fällen nur bei nicht veränderbaren Objekten (so wie Integer und Strings) Sinn ergibt.
So führt das dazu dass man in Python eine ganze Menge Workarounds braucht um mit default-argumenten zu arbeiten.
Das wichtigste dabei ist der default typ None. Das ist der workaround für alle mutable-objekte, da man die in fast keinem Fall zwischen verschiedenen Methodenaufrufen teilen möchte. So sieht das aus:
def end_poll(self, end_time=None):
if end_time is None:
end_time = datetime.utcnow()
# work with end_time...
Der Punkt hier ist dass man datetime.utcnow() nicht in das standard Argument hineinschreiben kann, da man sonst bei jedem Aufruf der Methode den gleichen Wert hätte: Die Parsezeit. Nicht sonderlich nützlich.
Das hat zur Folge dass man:
- aus der Signatur nicht sehen was das Standardargument ist (utc/gmt oder vielleicht ewas ganz anderes?). Immerhin gibt es inzwischen immer mehr IDEs die diese Signatur beim aufrufen für autocompletion nutzen oder sie wenigstens anzeigen können.
- Man beim verwenden von Standardargumenten immer überlegen muss ob man dieses Argument jetzt in die Methodendefinition oder in den Body aufnehmen muss.
- für jedes Standardargument noch mal zwei extra Zeilen braucht. Das nervt vor allem deswegen weil man sich mit den standard Argumenten ja Zeilen sparen möchte. Das heißt die Kosten für Standard-Argumente steigen und man benutzt sie seltener.
- die default argumente noch mal separat dokumentieren muss, da ein dokumentations-extraktions-Werkzeug ja den Code nicht sieht, der das tatsächliche Standardargument setzt. Und natürlich hat man dann noch mal DRY verletzt da die Information jetzt zwei mal da steht.
- richtig fiese Bugs kriegt, weil viele Leute diese Probleme nicht kennen oder sie ab und an vergessen und mal ein list(), dict() oder set() als Standardwert nehmen was dan für viel Freude beim Debuggen sorgt.
Also, know your Python und vorsicht mit Standardargumenten!
Vielleicht kriegen wir ja irgendwann von unserem BDFL ein from __future__ import runtime_standard_argument_evaluation.
SOLID object oriented design
Ein Vortrag von der GORUCO - sehr zu empfehlen.
Besonders gefallen hat mir ihr Fazit dass man mehr als nur DRY als Prinzip beim Refactoring anwenden soll um bei gutem Code anzukommen.
Sandy Metz empfiehlt das man sich an den 'Grünen' Stellen des Red/Green/Refactor Zyklus für jedes Objekt diese Fragen stellt:
- Is it DRY?
- Does it have one responsibility?
- Does everything in it change at the same time?
- Does it depend (only) on things that change less often than it does?
Und bringt das auch an einem ordentlichen Beispiel auf den Punkt.
Alles in allem: Ein Vortrag der zum Nachdenken über den eigenen Code-Stil einlädt. Empfehlenswert!
Here be electric dragons
Ich vertrete ja schon länger den Punkt dass ein Grundeinkommen eine Notwendigkeit sein wird in einer Gesellschaft in der Maschinen uns alle physischen Arbeiten abnehmen können.
Well, jetzt habe ich endlich jemanden gefunden der dieses Argument auch vertritt.
Auf dem 26C3 im Vortrag Here be electric dragons
Sehr sehenswert!
Method argument naming confusion
Schon seit einigen Wochen bin ich am grübeln, nach welcher Regel ich in Python meine variablen für Methoden-Argumente benennen soll. Das ist erstaunlicherweise gar nicht so klar.
Hier mal das Problem: In Objective-C ist alles sehr klar und einfach (von Smalltalk kommend). Jede Methoden-Deklaration besteht abwechselnd aus einem Teil Methodennamen und dann einer Variablen. Hier mal ein Beispiel:
- (void) setValue:(id)aValue forKey:(id)aKey
Das hat den großen Vorteil dass man den Methodennamen benutzen kann um Stück für Stück die Argumente zu dokumentieren. Verwendet wird das so, dass das Stück Methodennamen das vor einem Argument kommt die Rolle beschreibt die das Argument spielen wird, während der Name der Variablen eher generisch ist und sich eher am Typ orientiert. Dazu kommt natürlich das man die Typen auch explizit auszeichnen kann, was die notwendigkeit für die Typ-Annotation im Namen der Variablen im vergleich zu Smalltalk oder Python noch mal vermindert und man kann ihn ganz der Rolle hingeben die die Variable in der Methode spielen wird - versehen mit dem a/an/some/etc. prefix der Argumente (als generische Instanzen von etwas) von den lokalen und instanz-variablen unterscheidet.
In Python geht das so nicht. Man kann versuchen das auf zwei wegen anzunähern:
def set_value_for_key(a_value, a_key): pass
# benutze als: some_dict.set_value_for_key('value', 'key')
Das hat den Vorteil das man die Argumente mehr oder weniger benennen kann wie man möchte, aber den Nachteil das die Dokumentation der argumente nicht mit diesen zusammen ist. Das hat schon mal den unangenehmen seiteneffekt das es sehr viel schlechter auf mehrere Argumente skaliert und damit sehr fix mehr extra-dokumentation nötig macht.
Der andere Weg wäre so:
def set(value, for_key): pass #benutze als: some_dict.set(value='value', for_key='key')
Das hat den Vorteil dass der MethodenNamen von der Dokumentationshürde befreit ist - und damit Kurz wird. Auf der anderen Seite sind die Argument-Namen jetzt effektiv teil des Methoden-Namens und damit kann man sie nicht mehr so gut benutzen um den Typ der Argumente zu dokumentieren.
:-(
Das ist der Grund wieso ich die Objective-C / Smalltalk Syntax so gerne mag, weil es darin so einfach ist selbstdokumentierenden Code von hoher qualität zu schreiben.
Python Saug-Punkte
Viele standard-funktionen und module in python haben zu kurze namen.
Das ist deshalb ein Problem weil, man diese Namen nicht für lokale Variablen verwenden kann bzw. ungewollt eine Standardfunktion überschreibt.
id zum Beispiel. Oder dict, list.
Module sind dabei aber auch Problemkandidaten - vor allem wenn man sie häufig wie ein Objekt benutzt. Das json Modul macht mir immer wieder probleme, weil ich eine lokale Variable die json enthält nun mal gerne json nennen würde. json_serialization wäre vielleicht ein besserer Name für das Modul.
Die Standard-Bibliothek ist leider voll von solchen Beispielen und der Include-Mechanismus von Python der die Module quasi als Objekt im namespace des Empfängers verfügbar macht hilft da nicht wirklich weiter. Das ist zwar IMO eine bessere Idee als der C-Präprozessor #include (was Ruby ja zum Beispiel nachbaut) aber gerade bei so kurzen Namen kann das wirklich nerven.
Wenn man aus einem Modul ein Objekt importiert ist das interessanterweise kein Problem, da Objekte in Python (wenn sie sich an die Namenskonvention halten - leider auch oft nicht der Fall in der Standardbibliothek) immer mit einem Großbuchstaben anfangen und dadurch diese Namenskollision nicht auftritt.
Für mich ist da das Problem dass die Python Programmierer leider so eine Obsession damit haben alles möglichst kurz machen zu wollen - und dabei aber dem Programmierer der mit der (Standard-) Bibliothek arbeiten möchte gerade wieder Steine in den Weg legen dass kurz zu machen was für Ihn am meisten sinn macht - lokale Variablen.
Das ist leider Premature Optimisation in Reinstkultur - und es stört mich beim Entwickeln von meiner Software. :-(
How to crash IE 7 with javascript
Well, it's all too easy apparently. We stumbled upon the problem when suddenly our web application crashed left and right on us in IE 7.
I've since reduced the code involved and created a plugin to jQuery to make it easier to reproduce this.
Well, maybe perhaps sometimes somebody even discovers a use for the crashIE7 jQuery plugin. :)
In any event - it was fun creating this. :)
See the blog post page for the attached source and how to use this.
Python distributions
Endlich mal hab ich einen überblick gefunden wo die Entwicklung momentan hingeht.
http://mail.python.org/pipermail/python-dev/2009-October/092754.html
Kurz zusammengefasst:
- easy_install, ez_setup und Konsorten wird sterben. distribute ist die Zukunft
- easy_install wird sterben -> pip ist die Zukunft
- Metadata wird aus dem setup.py script herauswandern und stattdessen in einem ini file zur Verfügung gestellt (Da ist mir noch nicht ganz klar wie das funktionieren soll - aber gut).
- Deinstallieren wird auch mit den distutils gehen - man braucht also nicht mehr pip um das zu machen
Und noch mehr. Aber das find ich schon mal am wichtigsten. :)
Zur Schweinegrippe
Meine Mutter hat diesen lesenswerten Text dazu geschrieben - und den möchte ich gerne (mit ihrer Erlaubnis) noch mehr Leuten zugänglich machen. Grund dafür ist diese Email die gerade mit diversen gut klingenden Arzt-Namen als Absender auch durch meine Inbox wandert
Für alle, die überlegen sich impfen zu lassen :
Die beiden Impfstoffe gegen die so genannte Schweinegrippe *Pandemrix® Und Focetria®,* enthalten als Adjuvans (Impfverstärker ) *Squalen*. Beim Menschen ist Squalen bei den US-Soldaten des ersten Golfkriegs als Impfverstärker eingesetzt worden.
23-27% (also jeder Vierte, auch solche, die zu Hause blieben) bekamen Die Golfkriegskrankheit, Mit chronischer Müdigkeit, Fibromyalgie (Muskelrheuma), neben Gedächtnis-und Konzentrationsproblemen, persistierenden Kopfschmerzen, Erschöpfung und ausgedehnten Schmerzen charakterisiert. Die Krankheit Kann auch chronische Verdauungsprobleme und Hautausschlag einschließen.
Die Erkrankung hat sich seit 1991 also seit 18 Jahren nicht gebessert. Bei 95 % der Geimpften mit Golfkriegssyndrom wurden Squalen-Antikörper Gefunden.
Erst nach mehr als 10 Jahren wurden die Schäden vom US-Verteidigungsministerium anerkannt.
Wenn die Bundesregierung ihren Willen durchsetzt und 35 Millionen Menschen geimpft werden, ist damit zu rechnen, dass 8-9 Millionen Bundesbürger für die nächsten Jahrzehnte unter chronischer Müdigkeit und Fibromyalgie etc. leiden werden.
Unterschrieben von: $GUT_KLINGENDER_ARZT_NAME
Dazu hat sie diese gute Antwort geschrieben:
Ja, es stimmt. Pandemrix + Focetria enthalten Squalen, das injiziert zum Imunogen wird. Das ist seine wirkstoffverstärkende Ebene. Es wird auch in unserer Leber produziert, aber liegt natürlicherweise in öliger Form vor. Im Impfstoff aber als Emulsion, was einen Unterschied für die Verstoffwechselung im Körper macht. Der Verdacht, dass es etwas mit dem Golfkriegsyndrom zu tun hat, ist nicht erhärtet. Neuere Studien mit größeren Teilnehmergruppen zeigen keinen Zusammenhang zwischen Squalen-Antikörpern und chron. Symptomen.- Dennoch wird unabhängig von diesem Aspekt der Debatte um diese Impfstoffe ihre Sicherheit als ungenügend geprüft eingeschätzt. Er wird schlechter vertragen als ein Spaltimpfstoff ohne Wirkverstärker. Das ist sicher. ER wurde noch nicht an Schwangeren und Kindern erprobt und die jetzt eingesetzte Wirkstoffverstärkerdosis ist viel höher als in bisher eingesetzten Impfungen. Nebenwirkungen wurden noch nicht systematisch erfaßt. Auch seine Wirksamkeit ist noch nicht hinreichend erforscht, da eine verringerte Dosierung gegenüber der Zulassungsphase jetzt vermarktet wird.
Da die Grippe gutartig abläuft und kein höheres Risiko darstellt, als die bisherigen Herbstgrippen, ist davon bei sonst gesunden Menschen abzuraten, ebenso bei Schwangeren und Kindern. Hier herum impfen nur wenige Ärzte und auch die Kinderärzte sind sehr zurückhaltend. Jürgen hat herausgefunden, dass 1974 dieser Virus schon mal "um die Welt lief", so dass alle, die damals schon sich anstecken konnten, wahrscheinlich immun sind.
Mein Rat an alle, die sich schützen wollen und dazu beitragen möchten, das sich die Viren nicht ausbreiten:
- Bei ersten Symptomen ca 25 mg Zink einnehmen (gibt es als Tabletten) an zwei aufeinanderfolgenden Tagen. Parallel dazu Vitamin C Stoß mit heißer Zitrone o.ä. 2x täglich.
- Cystus 052 Infektblocker Tabl. lutschen (pflanzlicher Virenblocker).
- Wenn Fieber kommt, dieses auf über 39°C steigen lassen und abwarten. Viren werden durch Temperaturen über 39°C abgetötet. Es ist der effektivste Abwehrmechanismus. Die Nebenwirkungen des Fieberanstiegs ertragen sich am besten im Bett mit viel trinken und schlafen. Sobald die Viren keine Bedrohung mehr darstellen, geht das Fieber wieder runter (bei normalem Verlauf).
- Auch ohne Fieber soll sich jeder im Stadium des Niesen und Hustens von seinen Mitmenschen fernhalten, da er wie eine lebende Viren-Schleuder wirkt. Am besten freiwillig daheim bleiben und viel Zeit auf Pflege der Gesundheit verwenden (Nasenspülung, Inhalieren, Tee trinken, ausruhen, an die frische Luft gehen wenn möglich, Basenbäder nehmen, bei Bedarf Brustwickel, Atemübungen, viel frisches Obst).
Ich hoffe dass das auch für viele anderen Leute einiges an Fragen beantwortet und die Pharmaindustrie hoffentlich deutlich einnahmen kostet.

rss
