|
|
|
|
| Zitat von Smoking
So, mal eine etwas ausführliche Frage von mir:
Ihr habt hier wahrscheinlich alle schonmal eine JavaScript-Frameworks wie jQuery, Prototype und Konsorten benutzt.
Wofür setzt ihr diese Frameworks ein und was seht ihr an Vorteilen die sich durch die Nutzung der Frameworks ergeben?
Was gefällt euch an den einzelnen Frameworks und was empfindet ihr als verbesserungswürdig?
Wie benutzt ihr die Frameworks? Findet ihr es gut, dass man, je nach Framework, mit ein paar Zeilen Code weitere Funktionen in eine Oberfläche einbinden kann oder würdet ihr eher einen statischen Ansatz begrüßen, bei dem man einmal ein bestimmtes Featureset festlegt, für das dann eine eigene Bibliothek generiert wird?
| |
Mich haben solche Frameworks lange nicht interessiert, da ich von Javascript-Spielereien eh nicht viel hielt: Zu viel frickelei.
Mit jQuery hat sich das enorm geändert: Die DOM-Elemente sind Kinderlicht selektierbar. Genausoeinfach kann man jegliche Eigenschaften ändern, ohne auf die Browser-spezifischen Eigenheiten zu achten. Die Syntaxeigenheiten hat man auch sehr schnell drin.
Weiterhin finde ich gut, dass es mit diversen Drittanbieter-Plugins ganz schöne Animationen möglich sind. Siehe die Easing-Bibliothek zB.
Browser-Addons wie Firebug lassen auch Bugs relativ sinnvoll tracen.
Andere Frameworks habe ich nie ausprobiert (mootools, prototype)
Auch die jQuery-Struktur finde ich ganz gut: Eine Corelibrary und bei Bedarf lädt man halt noch mehr Plugins dazu.
Allerdings muss man da aufpassen, sonst ist man ganz schnell mal jenseits der 500kb
|
|
|
|
|
|
|
| Zitat von [Dicope]
Letztens entdeckt: .delegate( selector, eventType, eventData, handler )
Gott, ist das geil. Ich hab auch noch keine Aufgabe gefunden, die Jquery nicht in ein paar Zeilen könnte. <3 Jquery.
| |
Delegate kannte ich nicht. Awesome! \o/
|
|
|
|
|
|
|
Ui ja, musste erstma nachschlagen was das machen soll: Sehr praktisch!
e\ Ah mist, nu hab ich beim gucken mein Magnum verschlungen und kann mich gar nicht mehr richtig erinnern wie lecker das war
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von TriggerTG am 28.06.2010 18:53]
|
|
|
|
|
|
| Zitat von GH@NDI
So Trigger, da haste mal wieder was zum aufschauen
[...]
| |
"Generalprobe Bikemarathon 2010"
Wann ist denn dieses Event und worum geht es da?
--
Ich bräuchte ma soeinen wie Ghandi hier. Ständig nur alleine rumzugurken wird langsam trist. Aber die Leute winken immer nur ab. Erstens wegen der Entfernung und zweitens weil ich zu schnell sei
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von TriggerTG am 28.06.2010 19:13]
|
|
|
|
|
|
Hm, ok. Als Quintessenz heißt das wohl, dass ihr mit den zur Verfügung stehenden Werkzeugen zufrieden seid und gerade die Möglichkeit bevorzugt, mit ein bisschen Code die Funktionalität zu verändern.
Was würdet ihr von einem WYSIWYG Ansatz bzw. einem Generator halten, der euer Frontend mit ein paar Klicks generieren könnte?
Oder was würdet ihr von einem "MVC"-Framework halten, dass es euch erlaubt den Großteil eurer Logik auf den Client auszulagern?
|
|
|
|
|
|
|
Kommt stark auf die Umsetzung drauf an würde ich sagen: Klingt vorab zu unflexibel, zu langsam (die JS-Engines der Browser sind schon schneller geworden, aber evtl. sind die noch nicht schnell genug), zu sehr nach Frickelei
|
|
|
|
|
|
|
| Zitat von TriggerTG
| Zitat von GH@NDI
So Trigger, da haste mal wieder was zum aufschauen
[...]
| |
"Generalprobe Bikemarathon 2010"
Wann ist denn dieses Event und worum geht es da?
--
Ich bräuchte ma soeinen wie Ghandi hier. Ständig nur alleine rumzugurken wird langsam trist. Aber die Leute winken immer nur ab. Erstens wegen der Entfernung und zweitens weil ich zu schnell sei
| |
Albstadt Bikemarathon, 10.07.2010
// Ist ein Hobbymarathon. Mit meinem aktuellen 17er Schnitt rutsch ich da grade so in die 1000er finisher. Diese Jahr Starten 3.300 fahrer. Letztes Jahr war das Starterfeld noch auf 2.500 limitiert.
Ich fahr auch immer alleine. Hab mich aber auch dran gewöhnt, so kann ich mein Tempo machen. Wenn andere mal mit mir fahren wollen, sagen sie immer, ich soll ruhig vorher schonmal 40km machen, dann fühlen sie sich nicht so schlecht
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von GH@NDI am 28.06.2010 19:21]
|
|
|
|
|
|
Naja zu Zweit, wenn man ähnlich stark ist, wäre das schon ziemlich geil. So wird man auch auf Passagen, wo man grad schwach ist, doch wieder angetrieben.
Solange muss halt der meckernde Fahrradcomputer reichen, wenn die Geschwindigkeit unter den Durchschnitt rutscht.
|
|
|
|
|
|
|
| Zitat von Smoking
Was würdet ihr von einem WYSIWYG Ansatz bzw. einem Generator halten, der euer Frontend mit ein paar Klicks generieren könnte?
| |
Wird nichts. Zu unflexibel...im Zweifelsfall müsste man eh selbst frickeln.
| Zitat von Smoking
Oder was würdet ihr von einem "MVC"-Framework halten, dass es euch erlaubt den Großteil eurer Logik auf den Client auszulagern?
| |
Auch blöd. Schon aus Sicherheitsgründen müsste man die Hälfte der Logik auf dem Server wiederholen um sicherzugehen.
Mir würde es schon reichen, wenn es für diverse Serverseitige Frameworks die Möglichkeit gäbe mit wenig(!) Aufwand Serverseitige Endpunkte an JS zu binden. Und das bitte unabhängig von der Serverseite.
|
|
|
|
|
|
|
| Zitat von Achsel-des-Bösen
| Zitat von [Dicope]
Letztens entdeckt: .delegate( selector, eventType, eventData, handler )
Gott, ist das geil. Ich hab auch noch keine Aufgabe gefunden, die Jquery nicht in ein paar Zeilen könnte. <3 Jquery. | |
Delegate kannte ich nicht. Awesome! \o/
| |
Wo ist da jetzt der Unterschied zu live() und click() ?
|
|
|
|
|
|
|
Nirgends.
|
Code: |
Delegate is an alternative to using the .live() method, allowing for each binding of event delegation to specific DOM elements. [...]
|
|
http://api.jquery.com/delegate/
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von TriggerTG am 28.06.2010 19:35]
|
|
|
|
|
|
| Zitat von Achsel-des-Bösen
| Zitat von Smoking
Oder was würdet ihr von einem "MVC"-Framework halten, dass es euch erlaubt den Großteil eurer Logik auf den Client auszulagern?
| |
Auch blöd. Schon aus Sicherheitsgründen müsste man die Hälfte der Logik auf dem Server wiederholen um sicherzugehen.
Mir würde es schon reichen, wenn es für diverse Serverseitige Frameworks die Möglichkeit gäbe mit wenig(!) Aufwand Serverseitige Endpunkte an JS zu binden. Und das bitte unabhängig von der Serverseite.
| |
Das wäre gerade der Ansatz den ich damit verfolgen würde. Die Anbindung an den Server würde per Ajax geschehen und wie die Daten aussehen, die geladen werden, könntest du selbst bestimmen, da du sie letztlich auch selbst verarbeiten musst. Im Endeffekt könnte man damit auch ein "Liveupdate" bauen, dass halt in einem bestimmten Intervall den Server pollt.
Oder meinst du das anders?
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Smoking am 28.06.2010 19:40]
|
|
|
|
|
|
Arrr, warum ist dieser Trend an mir so spurlos vorbei gegangen: ORM (Objektrelationale Mapper, Hibernate z.B.) sind geil
|
|
|
|
|
|
|
Da hat man uns sogar in Datenbanken 1 direkt zu geraten, falls wir mal in der Verlegenheit kommen sollten, Datenbanken aus einer Hochsprache heraus ansprechen zu wollen.
|
|
|
|
|
|
|
Kann mir jemand sagen warum der String immer noch irgendwie ein AnsiString ist, und kein Unicode? Anstatt einem Unicode Zeichen empfängt der client nur ein "?"
|
Code: |
UnicodeString StrEncrypt( UnicodeString b )
{
wchar_t * buffer = b.w_str();
int temp2, temp3;
UnicodeString buff;
for (int i = 0; i < b.Length(); i++)
{
temp2 = buffer[i];
temp3 = temp2 + 0xF;
buff += (wchar_t)temp3;
}
return buff;
} |
|
|
Code: |
UnicodeString buffer = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ1234567890";
clients[i]->socket->WriteLnRFC( StrEncrypt( buffer )); |
|
|
|
|
|
|
|
|
| Zitat von [DK]Peacemaker
Ich frag nur noch mal, ob jemand von euch noch an dem Parser arbeitet?
| |
So hin und wieder mal, mehr aus Interesse an Parsertechnologie. Hab mir zu dem Zweck parallel mal eine Sammlung monadischer Kombinatoren für PEGs zusammengebastelt:
|
Code: |
type Parser<'a> = char list -> ('a * char list) option
// Monad
type ParserMonad() =
member x.Bind(p, f) = fun i ->
match p i with
| Some (v, r) -> (f v) r
| None -> None
member x.Delay(f) = fun i -> f () i
member x.Return(v) = fun i -> Some (v, i)
member x.Zero() = fun _ -> None
// Builder instance
let parse = new ParserMonad()
// Prioritized choice
let (</>) (p1 : Parser<'a>) (p2 : Parser<'a>) : Parser<'a> = fun i ->
match p1 i with
| Some (v, r) -> Some (v, r)
| None -> p2 i
// Lookahead
let notpred p : Parser<unit> = fun i ->
match p i with
| None -> Some ((), i)
| _ -> None
// Star, plus
let rec many p = many1 p </> parse.Return([])
and many1 p = parse {
let! x = p
let! xs = many p
return x :: xs }
// Characters and strings
let satisfy (pred : char -> bool) : Parser<char> = fun i ->
match i with
| c :: r when pred c -> Some (c, r)
| _ -> None
let whitespace = satisfy Char.IsWhiteSpace
let anychar = satisfy (fun _ -> true)
let character c = satisfy ((=) c)
let string str =
let rec _string str =
match str with
| s :: ss -> parse {
let! _ = character s
let! _ = _string ss
return s :: ss }
| [] -> parse.Return([])
_string (Seq.toList str)
// BB specific
let rec bbexpr =
let contents = parse {
let! _ = notpred (string "[/b]")
let! x = bbexpr </> anychar
return x }
parse {
let! _ = string "[b]"
let! _ = many contents
let! _ = string "[/b]"
return 'B' }
let bbparse = many (bbexpr </> anychar)
let result = "Hello [b]World[/b]!" |> Seq.toList |> bbparse |
|
Der BB-spezifische Teil da unten beschreibt z.B. den Abschnitt einer Grammatik, der verschachtelte Bold-Tags korrekt zuordnet. Eigentlich ziemlich elegant, und im Gegensatz zu vielen anderen Parsertechnologien kontextsensitiv. Ich stells mal zur Verfügung, falls jemand daran weiterbasteln will. Das auf die anderen Tags auszuweiten und ein DOM einzuziehen sollte nicht allzu schwer sein. Müsste auch problemlos in Haskell oder Scala zu übersetzen sein.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von igor]2 am 28.06.2010 20:49]
|
|
|
|
|
|
| Zitat von TriggerTG
Arrr, warum ist dieser Trend an mir so spurlos vorbei gegangen: ORM (Objektrelationale Mapper, Hibernate z.B.) sind geil
| |
ich schau mir grad nach einiger Zeit NHibernate mal Castle ActiveRecord an. IoC hab ich bisher wenn überhaupt mit Spring gemacht, aber jetzt wollte ich mir mal Castle anschauen. Und ActiveRecord basiert auf NHibernate, verzichtet aber auf das XML-Mapping. Bisher ist die Konfiguration im Zusammenspiel mit Castle Windsor ein Traum. Selbst einen AuditInterceptor bindet man einfach mal eben per Konfiguration ein, ohne eine einzige Zeile (Konfigurations-) Code.
|
|
|
|
|
|
|
| Zitat von CLiX
Kann mir jemand sagen warum der String immer noch irgendwie ein AnsiString ist, und kein Unicode? Anstatt einem Unicode Zeichen empfängt der client nur ein "?"
...
| |
Kodierungsprobleme saugen immer. Ist mir aus dem Codestück nicht ersichtlich, warum das nicht klappen sollte. Dass das so oder so kein echtes Unicode ist (auch wenn sie die Klasse noch so optimistisch "UnicodeString" nennen), sondern bestenfalls UCS-2 o.ä., ist dir ja klar/egal, vermute ich.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von igor]2 am 28.06.2010 21:39]
|
|
|
|
|
|
Hähä...der Typ der das Praktikum zu unserer Webtechnologie Vorlesung leitet, möchte zur Abgabe nur den Code und eine Installationsanleitung.
Unsere Projekt wurde unter Verwendung von Django, jQuery und der GoogleMaps API erstellt. Und das muss er dann unter Windows XP (das verwendet er) installieren und testen.
Um das technische Niveau des Typen zu umreissen: Er "lehrt" HTML 4.0 und JS auf dem Niveau von alert('Hallo Welt!'); . Außerdem hat benutzt er auf seinem Laptop einen IE6 bei dem im Fenstertitel "Hacked by GrimReperZ008" (oder so) steht. Klartext: Meine Mutter ist technisch weit höher qualifiziert.
Die Installation würde ich zu gerne mitbekommen. Wir liefern sicherheitshalber ein Fertigkonfiguriertes Linux als VirtualBox Image mit
|
|
|
|
|
|
|
| Zitat von igor]2
| Zitat von CLiX
Kann mir jemand sagen warum der String immer noch irgendwie ein AnsiString ist, und kein Unicode? Anstatt einem Unicode Zeichen empfängt der client nur ein "?"
...
| |
Kodierungsprobleme saugen immer. Ist mir aus dem Codestück nicht ersichtlich, warum das nicht klappen sollte. Dass das so oder so kein echtes Unicode ist (auch wenn sie die Klasse noch so optimistisch "UnicodeString" nennen), sondern bestenfalls UCS-2 o.ä., ist dir ja klar/egal, vermute ich.
| |
Hmm "bestenfalls UCS-2" - d.h. es werden nicht alle Zeichen unterstützt?
Woher bekomm ich denn dann eine "echte" Unicode Klasse?
Dreck
so sollte das Packet aussehen:
Und so sieht es aus:
(Andere Abweichungen ignorieren)
e/
http://docwiki.embarcadero.com/RADStudio/de/Unicode_in_RAD_Studio
hmmm
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von CLiX am 28.06.2010 22:03]
|
|
|
|
|
|
Okay, der Beschreibung nach rechnen sie löblicherweise wirklich mit Surrogatpaaren (= Buchstaben, die 4 Byte breit sind). Dann funktioniert die Umwandlung in wchar_t, wie du sie machst, allerdings "nur" für BMP-Zeichen -- für die meisten praktischen Anwendungen ist das allerdings echt mal egal. Reine Detailnachfrage meinerseits.
|
|
|
|
|
|
|
| Zitat von Achsel-des-Bösen
[...]
Die Installation würde ich zu gerne mitbekommen. Wir liefern sicherheitshalber ein Fertigkonfiguriertes Linux als VirtualBox Image mit
| |
Nerds
--
Ich lande neuerdings immer öfter auf stackoverflow für viele Fragestellungen. Hat sich echt gemausert seit seinem Start damals
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von TriggerTG am 28.06.2010 22:25]
|
|
|
|
|
|
Woah, ich habe bis Zehn Uhr geschlafen und bin jetzt schon müde für Bett. Super, damit läuft es ja langsam mit dem Tagesrhythmus (zumindest der Teil "Abend")
Gute Nacht!
|
|
|
|
|
|
|
ich finde vor allem das system „bewertbare antwort“ vs. „kommentar zu einer antwort“ gut durchdacht. da kommt meistens als erstes die beste antwort, tippfehler im code etc. übersichtlich in den kommentaren direkt darunter korrigiert.
apropos nerds: hab heute meine erste scrapinganwendung geschrieben. sie kann tf2-achievements eines spielers auslesen und auflisten (in gui, natürlich). sinnlos, weil nicht mehr optionen als die internetseite, aber hey!
|
|
|
|
|
|
|
| Zitat von flying sheep
apropos nerds: hab heute meine erste scrapinganwendung geschrieben. sie kann tf2-achievements eines spielers auslesen und auflisten (in gui, natürlich). sinnlos, weil nicht mehr optionen als die internetseite, aber hey!
| |
Über die XML-Schnittstelle der Steamcommunity-Site oder aus dem lokalen Cache im TF2-Ordner?
|
|
|
|
|
|
|
Ich wette, über geparsten HTML-Code
|
|
|
|
|
|
|
| Zitat von cLam
Ein Software Ingenieur (Programmierer) und seine Frau:
Sie: "Schatz, wir haben kein Brot mehr, könntest du bitte zum Supermarkt gehen und eins holen? Und wenn sie Eier haben, bring 6 Stück mit."
Er: "Klar Schatz, mach ich!"
Nach kurzer Zeit kommt er wieder zurück und hat 6 Brote dabei.
Sie: "Warum nur hast du 6 Brote gekauft?!?"
Er: "Sie hatten Eier."
| |
|
|
|
|
|
|
|
|
|
|
|
Ich hab auch einen tollen Scraper:
|
Code: |
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2010 Martin Thurau <martin.thurau@gmail.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# Parser for the Hafas online module
import sys, os
from os.path import abspath, dirname, join
from datetime import datetime, timedelta
from urllib import urlencode, urlopen
import logging
import re
# insert "lib" dir to the module search path
if __file__:
appDir = dirname(abspath(__file__))
libDir = join(appDir, 'lib')
sys.path.insert(1, libDir)
from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup
import mechanize
BASE_URI = "http://scout.hafas.de/bin/query.exe/dl?%s"
# IDs can be retrieved in this way:
# - [URL]http://scout.hafas.de/bin/query.exe/dl?[/URL]
# - choose any trip with includes the search station
# - press "Reisebegleiter" button
# - find the link with the searched station and copy the url
# - parameter "evalid" contains the ID
LOCATIONS = {
'FH': '715312',
'ZOB': '160021',
'SANDSTR': '711050',
'BESSEMER STR': '715322',
'MARIA GOEPPERT STR': '700857',
}
def extract_times(data, date_time):
soup = BeautifulSoup(data)
text = ''.join(soup.find('pre').findAll(text=True))
times = re.findall('\d\d:\d\d', text)
results = []
first_depart = None
for idx in range(0, len(times), 2):
# transform dates in real datetime objects
depart = datetime.strptime(date_time.strftime('%d.%m.%Y') +' '+ times[idx], '%d.%m.%Y %H:%M')
arrive = datetime.strptime(date_time.strftime('%d.%m.%Y') +' '+ times[idx+1], '%d.%m.%Y %H:%M')
# if time leap of the end of the day, they will be corrected
if not first_depart:
first_depart = depart
if arrive < first_depart:
arrive = arrive + timedelta(days=1)
if depart < first_depart:
depart = depart + timedelta(days=1)
results.append((depart, arrive))
return results
def get_trips(start_id, dest_id, date_time=datetime.now(), amount=3):
uri = BASE_URI % urlencode({
'date': date_time.strftime('%d.%m.%y'),
'time': date_time.strftime('%H:%M'),
'timesel': 'depart',
'externalCall': 'yes',
'start': 'yes',
'SID': "A=1@L=%s" % start_id,
'ZID': "A=1@L=%s" % dest_id
})
# config browser
br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
# calculate the needed number of fetches
fetch_amount = 1
if amount % 3 == 0:
fetch_amount = amount / 3
else:
fetch_amount = (amount//3)+1
# retreive initial data
res = br.open(uri)
fetch_amount -= 1
while fetch_amount > 0:
br.select_form(nr=0) # there is only one form on the page
res = br.submit(nr=1) # the second submit is the right one
fetch_amount -= 1
# extract data
times = extract_times(res.read(), date_time)
return times[:amount]
if __name__ == "__main__":
last_res = datetime.now()
res = get_trips(LOCATIONS['FH'], LOCATIONS['ZOB'], amount=15)
for t in res:
print t
|
|
Kann mir Busabfahrtszeiten aus dem Hafas-System unserer Verkehrsbetriebe laden. Würde theoretisch auch mit der Deutschen-Bahn gehen, sofern man etnsprechende IDs für Start und Ziel hat, denn die benutzen das selben System.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Achsel-des-Bösen am 28.06.2010 23:24]
|
|
|
|
|
|
Da ich wohl bald einen neuen Job habe, werde ich mir glaubich mal wieder was leisten! Einwände?
|
|
|
|
|
|
Thema: Gehirnsalat ( wir unter uns ) |