Code Issues

Wissenschaftliche Themen werden hier behandelt. Ziel ist die Gründung der OISS.
Benutzeravatar
sAik0
Beiträge: 1505
Registriert: Mo Nov 29, 2004 1:14 am
Wohnort: Klosterneuburg
Kontaktdaten:

Beitrag von sAik0 » Do Dez 15, 2005 8:19 pm

Ich kann, muss ich fairerweise sagen, auch keine Zahlen dazu angeben.
Ich hab aber dein Eindruck, dass die LAMP Kombination im Webserver Bereich die größte Bedeutung hat.

(Linux, Apache, MySQL, PHP)

ad Servelet Engines:

Der Tomcat ist sehr verbreitet für Servelets. Und er scheint da auch
gut zu funktionieren. Hab selber keinen laufen, weil ich keine java-Mensch bin.

Gibt aber eine Fülle von Engines:

Tomcat, IBM WebSphere, Weblogic, JRun, Resin, Orion, Oracle Application Server, Borland AppServer, Jetty, iPlanet (Netscape), GemStone/J, M5, Lotus Domino Go, ...

Einer davon geht sicher :D

Benutzeravatar
Grent
Bierfass
Beiträge: 15246
Registriert: Do Nov 11, 2004 1:00 pm
Kontaktdaten:

Beitrag von Grent » Do Dez 15, 2005 8:30 pm

sAik0 hat geschrieben:Kein vernünftiger Mensch (außer er verwendet den zugegeben guten MS SQL Server, und nicht mal dann ists nötig) würde jemals Windows als WebServer Plattform einsetzen.

Willkommen auf oatz.net. :D

Der :OATZ: -Server verwendet Windows und XAMPP. ;)
Für mich sehr ideal. Und für die User reichts sicherlich auch.
Religion is like a penis.

RocketLeague:
RLTN | RLStats | ballchasing.com | calculated.gg
:flag:

Benutzeravatar
zobi
Beiträge: 3688
Registriert: Mo Nov 15, 2004 1:00 pm
Kontaktdaten:

Grent = Salomon

Beitrag von zobi » Do Dez 15, 2005 9:33 pm

Danke....

Tomcat, IBM WebSphere, Weblogic, JRun, Resin, Orion, Oracle Application Server, Borland AppServer, Jetty, iPlanet (Netscape), GemStone/J, M5, Lotus Domino Go, ...

Das Open Source Thema hätten wir mit dieser Aufzählung also abgehackt. Ich weiß nicht genau was der Websphere kostet, aber mehr als 10 IIS mindestens. Und der Quellcode dazu liegt wahrscheinlich in Fort Knox :) . Dito der Domino server und der von oracle.

Benutzeravatar
florianklachl
Beiträge: 5904
Registriert: Sa Nov 13, 2004 1:00 pm
Kontaktdaten:

Beitrag von florianklachl » Di Dez 20, 2005 3:57 pm

Wer Lust hat, bitte bei mir melden. Das Projekt ist meiner Meinung nach total spannend.
wie gesagt, wenn in den sommerferien noch bedarf besteht, gerne. hab an sich eh schon cgi-entzugserscheinungen, nur halt jetzt nicht so viel freie zeit. mit neuen mysql5-features kenn ich mich aber leider gar nicht aus. OOP in PHP hab ich auch noch nie gemacht, das war in früheren PHP-versionen immer so verbugt. aber sollt glaub ich prinzipiell nicht ein problem sein.
http://www.proreligion.at/

Sei immer du selbst. Außer du kannst ein Einhorn sein, dann sei ein Einhorn!

Benutzeravatar
florianklachl
Beiträge: 5904
Registriert: Sa Nov 13, 2004 1:00 pm
Kontaktdaten:

Beitrag von florianklachl » Di Dez 20, 2005 4:04 pm

DateTime? a = null;
das fasst find ich recht gut einen wesentlichen vor- und nachteil von microsoft-programmiersystemen zusammen: man kommt recht schnell zu einem workaround, aber es ist dann halt eben ein workaround. würd mich jedenfalls interessieren, wie diese pseudoumwandlung in einen objecttype programmiertechnisch umgesetzt worden ist.
persönlich bin ich mit .net nicht so auf du und du, aber eigentlich nur deswegen, weil delphi in version 8 komplett darauf umgestiegen ist, und damit alten delphi-programmcode nicht mehr kompilieren kann, was mich sehr geärgert hat! delphi war bis dahin immer mein lieblingsprogrammierprogramm.
http://www.proreligion.at/

Sei immer du selbst. Außer du kannst ein Einhorn sein, dann sei ein Einhorn!

Benutzeravatar
sAik0
Beiträge: 1505
Registriert: Mo Nov 29, 2004 1:14 am
Wohnort: Klosterneuburg
Kontaktdaten:

Beitrag von sAik0 » So Jan 08, 2006 3:32 pm

florianklachl hat geschrieben:wie gesagt, wenn in den sommerferien noch bedarf besteht, gerne. hab an sich eh schon cgi-entzugserscheinungen, nur halt jetzt nicht so viel freie zeit. mit neuen mysql5-features kenn ich mich aber leider gar nicht aus. OOP in PHP hab ich auch noch nie gemacht, das war in früheren PHP-versionen immer so verbugt. aber sollt glaub ich prinzipiell nicht ein problem sein.
Kewl

Ich lass dir gerne mal einen SQL dump und code zukommen (sobal ich welchen produziert hab)

To do is to be (Karl Marx)
To be is to do (Jean Paul Sartre)
Do be do be do (Frank Sinatra)

Benutzeravatar
Brett
Beiträge: 11839
Registriert: Mi Dez 29, 2004 1:00 pm

Beitrag von Brett » Fr Feb 17, 2017 8:56 am

Hallo, vielleicht kann mir wer helfen (ich denk da eh nicht an wen ganz bestimmten. ;) ):

Seit einiger Zeit beschäftig ich mich mit Python (2.7) und schreib da unter Windows kleine Progrämmchen, die mit pyserial über einen COM Port Sensoren auslesen und zu Kalibrier-Zwecken drauf schreiben.

Ich weiß soweit, dass die Ausgabe auf der Python-Konsole mit dem richtigen Zeichensatz abhängt von:
- bewusstem Schreiben des Source-Files in einem bestimmten Zeichensatz
- Angabe des Zeichensatzes im Kopf der Datei

Ich hab da jetzt mit meinem Editor (Spyder) mehrere Versuche hinter mir, dann auch versucht, den Zeichensatz mit Notepad++ zu konvertieren, verschiedentlich zu speichern ... fruchtet alles nicht.

ö, ä, ß, ° etc. werden auf der Python-Konsole NIE richtig ausgegeben, was SEHR nervig ist.

Weiß wer eine Patentlösung (für Windows, wohlgemerkt ;) )?
Forma, Eier Gnodn.

Benutzeravatar
mastastefant
Schnapsbar
Beiträge: 3856
Registriert: Sa Dez 04, 2004 1:00 pm
Kontaktdaten:

Beitrag von mastastefant » Sa Feb 18, 2017 1:14 am

Oh gott .. Zeichensatzprobleme ..

Also: Wenn man Probleme mit Zeichensatz hat, ist es immer das Beste, ganz genau bei jeder Variable, jeder Eingabe und jeder Ausgabe sich genau zu überlegen, welches Format / welcher Typ das ist, und wo was von wem wie konvertiert wird, und ganz besonders wann eben nicht konvertiet wird. Wenn man da nicht genau ist und zu vermischen anfängt, hat man verloren. Wenn man genau ist, ist es eigentlich ganz leicht. Quasi wie physikalische Einheiten.

Das Datei-Encoding definiert in der Tat nicht, in welchem Encoding Strings ausgegeben werden.

Das Datei-Encoding definiert, wie die individuellen Bytes in der Sourcecode-Datei interpretiert werden sollen, insbesonders wie String Literale gelesen und konvertiert werden.
https://docs.python.org/2/reference/lex ... ml#strings

Erklärung:

Python 2.x kennt zwei Arten von Strings: 'normale' Strings und Unicode Strings.

- Strings sind in Wahrheit einfache Byte arrays (8-bit characters). Strings haben kein bestimmtes Encoding, man muss das Encoding vom String selber wissen. Standardmäßig werden Strings als ASCII interpretiert. Byte-Werte 1-127 sind gültige ASCII Zeichen, 128-255 sind keine gültigen Zeichen, können aber verwendet werden. Ungültige Zeichen werden als Hex-Code angezeigt (z.b. \xe4 für Latin-1 'ä', bzw. \xc3\xa4 für UTF-8 'ä').

- String Literale sind String Konstanten im Quellcode, mit Anführungszeichen geschrieben. Das Datei-Encoding definiert, wie Zeichen in String-Literalen vom Editor angezeigt werden bzw wie eingegebene Zeichen in der Source-Datei und somit in der String Variable als Bytes gespeichert werden.. Mit Escape-Sequenzen kann man auch Zeichen außerhalb des Encodings eingeben (z.b. s = "abc\xe4" für "abcä"; Man bedenke dass die Escape-Sequenz natürlich im Encoding der Datei eingegeben werden muss... aber diese Zeichen sind ASCII und haben in fast allen Encodings die selbe Binär-Repräsentation).
Wenn man z.B. s = "abcä" hinschreibt, landet dann im String die Byte Werte 0x61, 0x62, 0x63, 0xE4 - vorausgesetzt das Encoding der Datei ist Latin-1! Wenn man die selbe Datei als ASCII oder UTF-8 definieren würde, wäre der Text einfach ungültig und würde kaputt angezeigt werden, bzw. kann Python bei UTF-8 sogar das schließende " nicht finden und die Quelldatei nicht mal lexen (und somit schon gar nicht parsen .. :ass: ).
Wenn man s = "abcä" in einer UTF-8 Datei hinschreibt, landen die Byte Werte 0x61, 0x62, 0x63, 0xC3, 0xA4.. D.h. beim dekodieren des Strings nach unicode() muss man das Encoding der Quellcode-Datei kennen!

- Unicode Strings sind String Variablen die nur gültige Unicode Zeichen (Codepoints) beinhalten. Der Inhalt ist *immer* Unicode, ungültige Unicode-Codepoints sind nicht erlaubt. Das Encoding ist nur relevant, wenn man den Unicode String wo einließt oder rausschreibt (also als Byte-Sequenz in einem bestimmten Format wohin schreibt oder woher bekommt).

- Unicode String Literale sind String Konstanten die nur Unicode beinhalten. Das Datei-Encoding definiert, wie Zeichen in Unicode-Literalen interpretiert und in codepoints umgewandelt werden. Wenn man z.B. s = u"abcä" schreibt (bei Latin-1 Datei Encoding) wird in s ein Unicode String mit den Codepoints für die Zeichen 'a', 'b', 'c' und 'ä' gespeichert. Da der erzeugte String ein Unicode-String ist, ist der Inhalt des Strings unabhängig vom Encoding der Datei!

https://docs.python.org/2/howto/unicode.html

Python erkennt außerdem das Encoding von stdout und stdin automatisch. Wenn man z.B. Python auf der Windows-Shell ausführt, ist das Output Encoding UTF-8 oder CP-1252. Wenn man die Ausgabe oder Eingabe in eine Datei oder eine Pipe umleitet, hat Python kein Encoding. Print konvertiert Unicode Strings automatisch auf das richtige Output Encoding. Normale Strings werden (denke ich) als ASCII interpretiert und entweder 1:1 als bytes direkt oder mit Hex Escape-Sequenzen für Non-ASCII chars ausgegeben.
c:\> python
import sys
print(sys.stdin.encoding, sys.stdout.encoding)
Daher:

- Bei Quellcode Dateien prinzipiell *immer* nur ASCII verwenden und keine Sonderzeichen im Quellcode verwenden. Wenns aber sein muss und man unbedingt Umlaute in String Literalen verwenden muss ohne sie in Hex einzutippen, dann UTF-8 als Datei-Encoding verwenden. Dann aber jene String Literale die Umlaute,.. beinhalten als Unicode String Literale definieren (u"abcä.."); Kommentare und Variabennamen,.. sollten sowieso immer Englisch sein und nie Sonderzeichen beinhalten. Niemals Latin-1/8859-1 oder so was als Zeichensatz verwenden (UTF-8 Text-Dateien werden (in der Regel) mit einem Magic Byte als solche erkennbar gemacht, bei Latin-1 etc. muss der Editor/der Programmierer raten; Bei Programmiersprachen wie C etwas anderes als ASCII verwenden ist prinzipiell eine schlechte Idee).
BTW, besonders wenn man plattformübergreifend arbeitet (aber am besten generell) ist es auch ratsam, sich einheitliche Line-Endings in allen Dateien anzugewöhnen, am besten Unix-Lineendings (LF) - auch wenn Notepad denk ich immer noch nicht damit zurecht kommt. Sonst bekommt man Probleme mit dem Versionssystem (Git) und anderen Tools.

- Niemals Sonderzeichen in normalen String-Literalen verwenden, sondern Unicode String-Literale verwenden.

- Text der Sonderzeichen beinhalten können sollte als Unicode String behandelt werden. Dann kümmert sich print selbst um das richtige Encoding bei der Ausgabe.

- Wenn man Strings von irgendwo als nicht-Unicode Strings reinbekommt, muss man sie erst mit str().decode() mit dem Input-Charset dekodieren und in Unicode umwandeln. Wenn man Unicode Strings in eine Datei schreiben oder über den seriellen Port schicken will, muss man sie erst ins richtige Format kodieren (unicode().encode()).

Was also über den Serial-Port daherkommt ist sicher ein reiner Byte String, der in irgendeinem Encoding reinkommt (Latin-1 vermutlich). Den musst du dekodieren um ein Unicode Objekt draus zu machen, dann wirds beim print automatisch aufs richtige Terminal-Charset konvertiert.
# Returns an latin-1/.. encoded byte-array
input = read_from_serial()
# Decode with the proper encoding that is used by the sender
unicode_input = input.decode("latin-1")
# Let print deal with the correct output encoding
print( unicode_input )
# Encode as UTF-8 byte-array, e.g. for writing to a file
utf8_output = unicode_input.encode("utf-8")
Python 3:

Bei Python 3 hat sich das Verhalten und die Syntax quasi komplett umgedreht:
http://pythoncentral.io/encoding-and-de ... ython-3-x/

- In Python 3.x sind alle Strings Unicode. Das Datei-Encoding bestimmt weiterhin, wie die gespeicherten Bytes im Quellcode nach Unicode umgewandelt wird und im Editor dargestellt werden.
- Die "normalen" 8-bit strings von Python 2.x sind in Python 3.x byte arrays (b"abc\xe4"). Sonderzeichen in Byte-Arrays können nicht direkt als Literale eingegeben werden (b"abcä" ist ein Fehler).
- Konvertieren von byte arrays zu (unicode) Strings geht weiterhin über .decode(), allerdings funktioniert dies nur für echte Byte-arrays, nicht für Strings (also "abcä".decode("latin-1") geht nicht, nur b"abc\xe4".decode("latin-1") geht).

D.h. bei Python 3.x muss der Serial-Driver statt einem String ein Byte-array zurückliefern (das ist auch in jedem Fall bei Python 2 das richtige, da der serielle Treiber ja nur Bytes auf der Leitung sieht und nicht als darstellbaren Text nach Zeichensatz interpretiert). Dann funktioniert der selbe Code wie oben.
Falls der Python 3 Treiber Strings zurückliefern würde/sollte, muss man ihm das Encoding sagen können müssen, damit er die Strings erst korrekt dekodieren kann. Dann könnte der Treiber allerdings keine Binärdaten übertragen (welche auch Bytes beinhalten kann, die keine legalen Zeichen in Input-Encoding sind - ein Unicode String kann keine beliebigen Binärdaten enthalten).

Für Python 3.x Kompatibilität daher immer Binär-Strings und -Literale als solche explizit erzeugen und dort keine Sonderzeichen verwenden (b"abc\xe4").
I find your lack of platform support disturbing.

Benutzeravatar
Brett
Beiträge: 11839
Registriert: Mi Dez 29, 2004 1:00 pm

Beitrag von Brett » Sa Feb 18, 2017 12:15 pm

Danke für deine Zeit! So wie von dir "from scratch" erklärt hab ich das leider sonst nirgends im Netz gefunden. Das ist immer dann zach, wenn man nur begrenzt Zeit zur Verfügung hat. Teilzeit-Programmieren ist überhaupt ein Schas.
Werd mich bei nächster Gelegenheit mal näher mit dem Code-Umbau auseinandersetzen und berichte, wie's war.

Aber das Programm an sich geht recht gut, Dreipunktkalibrierung von Temperatursensorne auf wenige Hundertstel K genau. :) Als nächstes kommt ein Multiplexer für Serienproduktion dazu.
Forma, Eier Gnodn.

Benutzeravatar
mastastefant
Schnapsbar
Beiträge: 3856
Registriert: Sa Dez 04, 2004 1:00 pm
Kontaktdaten:

Beitrag von mastastefant » Sa Feb 18, 2017 4:27 pm

Ja, ich habs mir auch erst mal wieder ansehn bzw. aus div. Seiten zusammenklauben müssen, und hab auch erst dabei den genauen Unterschied zwischen Unicode-Strings und Strings gelernt (ich hab sonst praktisch nie was anderes als ASCII in der Hand). Auch dass sich das in Python 3 so stark geändert hat, hat mich überrascht. Wieder was gelernt.

Das praktische ist allerdings, dass die Konzepte dahinter (Encoding, Unterschied zwischen Binär-Array/String und Text-String, Kodieren/Dekodieren bein Ein- und Ausgabe, Unterschied zwischen internen Format und Übertragungsformat, ..) sich auf alle Programmiersprachen umlegen lassen, das ist immer das gleiche egal ob man Assembler am µC oder Java oder C am Desktop schreibt, oder man von einem Windows-Browser mit CP-1252 durch einen Webserver auf einem UTF-8 Linux in eine Latin-1 SQL-Datenbank durchschreibt. Dadurch wenn man das dahinter verstanden hat, kann mans schnell auf eine andere Sprache oder Umgebungen umlegen.

Am Besten ist es bei so was auch immer, sich an die Primärquelle, sprich die Programmiersprachendoku zu wenden. In den Foren wie stackoverflow findet man oft gute erste Anhaltspunkte, aber oft stehn auch dort nur Halbwahrheiten bzw falsche Interpretationen, Ein Zeichen vertrauenswürdiger Beiträge auf stackoverflow ist immer, wenn die Antwort a) länger ist und b) auf die Spezifikation dahinter verlinkt..
I find your lack of platform support disturbing.

Antworten