HBuick
Themenersteller
Beginner (15 Beiträge)

Linksammlung mit Suchmaschinenoberfläche (Seite 2)


HBuick
Beginner (15 Beiträge)
am 14.07.2012, 09:44 Uhr schrieb HBuick

romacron schrieb:
Diese Hilfsfunktionen die "Auswahl" nachladen sind recht aufwendig zu bauen. Da sollte man gut Acht geben, das der Server da irgendwann nicht die Grätsche macht.

Bei Vertippern im Autocomplete wird bei jedem Tastendruck Levenshtein für die ganze Labellist eingesetzt. Das könnte schon viel werden.
Habe jetzt mal eine Zeitmessung eingebaut: 5 Millisekunden ohne Vertipper, 6 Millisekunden mit Vertipper, länger noch bei mehreren Wörtern. Ist das viel?

romacron schrieb:
Irgendwo geht hier die ganze Arbeit und das Know-How unter!
...
So wie die Methoden aussehen, haben die sich Stück für Stück entwickelt. Ich meine das dieser langwierige Prozess auch sichtbar wird, wenn man auch nur einen Funken von Javascript und Entwicklung versteht.

Danke! Der Hauptbrocken ist hier an der Oberfläche nicht zu sehen. Die ganze Programmierung ist praktisch unter der Motorhaube, das Frontend ist nur der Lack. Das war wirklich eine lange Entwicklung, weil auch die Ideen, Strukturen und Aufbau erst während Entwicklung und Testen wachsen. Ich habe jetzt fast ein Jahr nichts dran gemacht, ausser jetzt der Änderung am Design des Frontends (Iframe rausgeschmissen), und embeded Code-Eingabe für Youtube usw. eingebaut.

romacron schrieb:
Im öffnenden Beitrag steht "komme aber mit verschachtelten DIVs noch nicht so gut zurecht." So darf man sicher nicht an der Frontend-Entwicklung meckern. Das macht meiner Meinung nach nen Unterschied.
Wegen ein paar verschachtelten und zerschossenen Element würde ich mir keine Sorge machen.
Html und Css sind relativ einfach zu erlernen.

HTML benutze ich schon lange, habe aber einfach noch nicht viel versucht, das floaten in den Griff zu bekommen. Mir scheint,beim floaten, dass man da auch viele Workarounds benutzen muss, um das zu erreichen was man will, das schreckt mich ab, die Umsetzung scheint nicht direkt und einfach, die Strukturierung der div geht beim floaten verloren, das stört mich total, tabellen kann ich einfacher ausrichten, aber ich werds trotzem versuchen...

romacron schrieb:
Ne Weile Refactoring und das JS blitzt...

An eine komplette Neustrukturierung (auch beim PHP) traue ich mich nicht ran, aber stückchenweise verbessern ginge schon.

Viele Grüße, Holger Buick


joerg
Avatar joerg
Fachinformatiker Anwendungsentwicklung
Content Gott (1941 Beiträge)
am 14.07.2012, 09:53 Uhr schrieb joerg

Hallo Holger

Also zuerst mal die Datenbank mit UTF-8 aufbauen.

Wenn es dann noch zwischen der Datenbank und dem Server bei der Verbindung hakt gibt es je nach Abfrageart der Mysql Datenbank verschiedene Anweisungen um das als UTF-8 zu erklären.

Sollte im Grunde aber nicht nötig sein zu verwenden wenn die Datenbank richtig aufgebaut ist. Ich weiss jetzt aber nicht welche PHP Funktionen du jetzt nutzt für die Abfragen der Datenbank.

Ich kopiere einfach mal aus meinen Klassen dazu den Aufbau der Verbindung und die Anweisung für den Zeichensatz UTF-8. Ist an der Stelle dann für mich nur noch eine zusätzliche Sicherheit.

PDO <?php $this->cn = new PDO(\'mysql:host=\'.parent::MB_SERVER.\';dbname=\'.$mb,parent::MB_USER,parent::MB_PASSWORT,array(PDO::MYSQL_ATTR_INIT_COMMAND => \'SET NAMES utf8\')); ?>

Mysqli OOP Schreibweise <?php $this->cn = new mysqli(parent::MB_SERVER,parent::MB_USER,parent::MB_PASSWORT,$mb);
$this->cn->set_charset(\'utf8\'); ?>


Mysqli <?php $this->cn = mysqli_connect(parent::MB_SERVER,parent::MB_USER,parent::MB_PASSWORT,$mb);
mysqli_set_charset($this->cn,\'utf8\'); ?>


Mysql <?php $this->cn = mysql_connect(parent::MB_SERVER,parent::MB_USER,parent::MB_PASSWORT,true);
mysql_select_db($mb);
if(function_exists(\'mysql_set_charset\')) mysql_set_charset(\'utf8\');
else mysql_query("SET NAMES \'utf8\'"); ?>


Falls du jetzt eine prozedurale Form brauchst müsste man wissen wie du über PHP die Mysql Datenbank abfragst.

Der andere Part ist die Datei die für die Ausgabe verantwortlich ist.
Hier wird dann ein Header benötigt der das Dokument als UTF-8 ausgibt.

www.w3.org/International/questions/qa-changing-encoding.de.php



Es existiert so ein Irrglauben das durch Metaangaben bereits UTF-8 erreicht ist.

www.w3.org/International/O-charset.de.php



Und man sollte hat eben auch seinen Editor/IDE darauf einstellen das die Seite als UTF-8 gespeichert wird. Und am besten so das kein Byte Order Mark am Anfang gesetzt ist. Es gibt da so einige Editoren bei denen das BOM immer gesetzt wird. An der Stelle wäre dann ein anderer Editor wohl die beste Wahl. Diesen Schritt habe ich auch mal gehen müssen.

www.w3.org/International/questions/qa-utf8-bom.de.php



Und dazu dann noch ein hilfreiches Werkzeug.

validator.w3.org/i18n-checker/



Gruß
Jörg


Zufällige Umleitung zu der Startseite einer meiner Domains
Meine ungewöhnlichen Tools

HBuick
Beginner (15 Beiträge)
am 14.07.2012, 11:14 Uhr schrieb HBuick

Hallo Jörg, vielen Dank für die Codeschnipsel und die Links.

joerg schrieb:
Also zuerst mal die Datenbank mit UTF-8 aufbauen.

so sieht das bei mir aus:

Server: Localhost via UNIX socket
Server Version: 5.0.77
Protokoll-Version: 10
Benutzer: (unkenntlich gemacht)
MySQL-Zeichensatz: UTF-8 Unicode (utf8)

unter localhost steht: Zeichensatz / Kollation der MySQL-Verbindung Dokumentation: utf8_general_ci

In den einzelnen Datensätzen steht drin bei Kollation: latin1_swedish_ci

joerg schrieb:
Sollte im Grunde aber nicht nötig sein zu verwenden wenn die Datenbank richtig aufgebaut ist. Ich weiss jetzt aber nicht welche PHP Funktionen du jetzt nutzt für die Abfragen der Datenbank.


<?php
parse_str("$QUERY_STRING");

$db = mysql_connect("localhost", "[???]", "[???]") or die("Could not connect.");
if(!$db)
die("no db");
if(!mysql_select_db("[???]",$db))
die("No database selected.");
if(!get_magic_quotes_gpc())
{
$_GET = array_map(\'mysql_real_escape_string\', $_GET);
$_POST = array_map(\'mysql_real_escape_string\', $_POST);
$_COOKIE = array_map(\'mysql_real_escape_string\', $_COOKIE);
}
else
{
$_GET = array_map(\'stripslashes\', $_GET);
$_POST = array_map(\'stripslashes\', $_POST);
$_COOKIE = array_map(\'stripslashes\', $_COOKIE);
$_GET = array_map(\'mysql_real_escape_string\', $_GET);
$_POST = array_map(\'mysql_real_escape_string\', $_POST);
$_COOKIE = array_map(\'mysql_real_escape_string\', $_COOKIE);
}
?>

$abfrage = "SELECT * from tsoo_labelproperties where name = \'$mylabel\'";
$ergebnis = mysql_query($abfrage) or die("Could not query labelproperties table");
while($labelrow = mysql_fetch_array($ergebnis))


Ãœbrigens: Ich benutze den TinyEdit als Editor.

Viele Grüße Holger Buick


klaus_b
Avatar klaus_b
Er ernährt mich ;-)
Content Meister (328 Beiträge)
am 14.07.2012, 11:23 Uhr schrieb klaus_b

Hallo Holger,

erstmal vielen lieben Dank für deine ausführliche und offene Antwort.

HBuick schrieb:
Angefangen habe ich mit "Kölner Phonetik", dann habe ich Levenshtein dazugenommen, dann nur noch Levenshtein.


Das bekomme ich irgendwie nicht zusammen
Begriffe/Wörter mit der Kölner Phonetic codiert und darauf dann Levenshtein loslassen?
Oder meinst du viel mehr: Die Eingabe wird mit der Kölner Phonetic codiert und mit einer Liste codierter Wörter verglichen. Wenn kein Treffer wird der Klartext via Levenshtein mit einer Wortliste verglichen und dann anhand des Wertes entsprechend reagiert?

HBuick schrieb:
<snip>Gib mal einen Vertipper ein, oder nur einen Wortanfang, dann die Leertaste, und du wirst merken, dass du das erste Wort nicht weiterschreiben musst und trotzdem weiterkommst in der Eingabe mit den vorgeschlagenen weiteren Labels zur Eingrenzung der Suche. Ich habe mich da von der Google-Eingabe inspirieren lassen.

Nennt sich Autosuggest
Ich löse solche Aufgaben gerne mit einer binären Suche in einer Wortliste, die dynamisch im Backend nachgeladen und dann via WebService vom Client abgefragt wird.

HBuick schrieb:
Am Anfang dachte ich auch, ich müsste erstmal eine Liste aller wichtigen Wörter haben, habe z.B. aus "Esperanto Vortaro" oder repo.or.cz/w/wortliste.git versucht die wichtigsten Wörter herauszuholen.

Ohne eine Stammwortliste wird das ganze Konzept aber nicht funktionieren. Woher soll der Algorithmus sonnst sinnvolle Wörter aus einem Domänennamen extrahieren? Z.B. dasistmeinesuperdomaene.de
Entweder du hast eine Stammwortliste anhand der sprachspezifisch die einzelnen Begriffe, Füllwörter udgl. extrahiert werden, oder du arbeitest mit einem WordBoundary Algorithmus aus der Linguistik. Diese Algorithmen sind AFAIK aber sehr unzuverlässig, wenn etwa "denglisch" verwendet wird.

HBuick schrieb:
Dann habe ich gemerkt, dass es besser ist, die Liste mit den eingegebenen Links wachsen zu lassen. Wird ein Link neu eingegeben und dabei ein neuer Label, dann kann im Backend dieser Label eingeordnet werden.
- Entweder als Synonym dann verschwindet dieser Label als eigenständiger Datensatz, oder
- hirarchisch, also Oberbegriffe, dann wird dieser Label bei dem "Elternlabel" eingetragen. Dabei wird bestimmt, ob die Weiterleitung in eine oder beide Richtungen gehen soll.
Alle Synonyme, die zusammengehören werden unter einem dieser Wörter in einen Datensatz gepackt.
Hirarchisch bezogene Wörter bleiben als eigenständige Datensätze bestehen.
Das ist alles so in die Struktur der Datenbank und Tabellen integriert, dass es auf Geschwindigkeit optimiert ist, also die Daten sind mehrfach vorhanden, werden also aus den Ausgangstabellen in Tabellen kopiert, wo der Zugriff einfacher wird.

Hier beschreibst du, wenn ich dich richtig verstehe, exakt den Aufbau eines Thesaurus, der nur mit Erweiterungen arbeitet.
<extension>
<syn>JavaScript</syn>
<syn>JS</syn>
<syn>JScript</syn>
</extension>
[/quote]

Mich interessiert diese Thematik deshalb so brennende, weil ich gerade für ein Projekt ganz ähnliche Anforderungen im Backend habe. Dort werden Domänennamen, sprachunabhängig, in Begriffe zerlegt und in einen Wortkatalog eingeordnet. Dabei bleiben immer "Wortreste" aus noch unbekannten Begriffen und Silben übrig. Für diese "Wortreste" habe ich noch keine funktionierende Lösung. Daher verarbeite ich diese "Wortreste" im Moment noch manuell.
Dieser Katalog ist der Teil einer Heuristik, der mittels des Bayestheorem die Wahrscheinlichkeit eines Zustandes bestimmt. Es sind zwar noch andere heuristische Methode enthalten, aber dieser Bereich stellt die Kernfunktionalität.

Servus,
Klaus


klaus_b@.NET über alles was an .NET und C# Spass macht.

joerg
Avatar joerg
Fachinformatiker Anwendungsentwicklung
Content Gott (1941 Beiträge)
am 14.07.2012, 11:51 Uhr schrieb joerg

HBuick schrieb:

unter localhost steht: Zeichensatz / Kollation der MySQL-Verbindung Dokumentation: utf8_general_ci



Hallo Holger

Ist zumindest schon mal UTF-8.
Die Frage ist es ob du mit utf8_unicode_ci nicht besser bedient bist.

dev.mysql.com/doc/refman/5.1/de/charset-unicode-sets.html



HBuick schrieb:

In den einzelnen Datensätzen steht drin bei Kollation: latin1_swedish_ci



Die Datenbankfelder wo Umlaute zum Beispiel vorkommen sollten zumindest eine UTF-8 Kollation erhalten.

HBuick schrieb:

<?php
$db = mysql_connect("localhost", "[???]", "[???]") or die("Could not connect.");
?>



Sollte dann in diesem Fall um

<?php
if(function_exists(\'mysql_set_charset\')) mysql_set_charset(\'utf8\');
else mysql_query("SET NAMES \'utf8\'");
?>

ergänzt werden.

Ãœberlegen würde ich mir dann zumindest mysqli prozedural einzusetzen.
Die Unterschiede sind nicht allzu gross.

Gruß
Jörg


Zufällige Umleitung zu der Startseite einer meiner Domains
Meine ungewöhnlichen Tools

HBuick
Beginner (15 Beiträge)
am 14.07.2012, 19:51 Uhr schrieb HBuick

Hallo Klaus

zu Levenshtein: ich habe nochmal die alten Sicherungen durchgeforstet: also ich hatte die zweite Methode verwendet, obwohl ich dachte, die erste auch versucht zu haben.

zum Autosuggest: ich mache das auch mit AJAX. In der Wortliste, das ist hier dann die Tabelle mit den Links, da sind die Labels jeweils mit drin (redundant), werden diejenigen Labels eingesammelt, die gemeinsam mit dem vorgegebenen Label in jeweils einem Link vorkommen.

zur Stammwortliste: Das Suchen in den Domainnamen ist bei mir erst die zweite Option. Zunächst wird in den Labels gesucht. Jedem Link sind bis zu vier Labels zugeordnet. Es gibt bis jetzt über 1000 Links und über 700 Labels. Als dritte Option, wenn nichts gefunden wird, wird in der Beschreibung der Links gesucht.

zum Thesaurus: Das ganze Verfahren habe ich von grundauf selbst entwickelt und ausgedacht, weil es einfach ganz bestimmten Zielvorstellungen entsprechen muss. Ob das ein Thesaurus ist, kann ich nicht sagen. Extensions benutze ich nicht.

Zu den Domänen: hier ist eine Seite www.domaindatei.de die aus mindestens drei Buchstaben die Domains herausgibt.



Zum Bayestheorem: habe das hier mal überflogen: betterexplained.com/articles/an-intuitive-and-short-explanation-of-bayes-theorem/ Die genaue Funktion deines Projekts, also was damit erreicht werden soll, ist mir nicht klar. Willst du Domainnamen bewerten?



Viele Grüße, Holger Buick


HBuick
Beginner (15 Beiträge)
am 14.07.2012, 21:21 Uhr schrieb HBuick

Hallo Jörg,

joerg schrieb:
Die Datenbankfelder wo Umlaute zum Beispiel vorkommen sollten zumindest eine UTF-8 Kollation erhalten.


Wenn ich die jetzt einfach von latin1_swedish_ci auf eine UTF-8 Kollation umschalte, kann das Probleme geben mit den vorhandenen Daten? Evtl. funktioniert dann einiges nicht mehr?

Danke für den Hinweis mit mysqli, kannte ich noch nicht, laut wikipedia hat das den Vorteil SQL-Injections besser abwehren zu können.

Ich benutze hier durchweg keine OOP, das macht für mich bei diesen vielen kleinen Programmabschnitten keinen Sinn, der Ablauf ist sowieso Prozedural. Auch mit Funktionen kann ich gut strukturieren. Die Unterschiede sind mir bekannt aus C - C++.

Eine zeitlang habe ich C mit WinAPI programmiert ( www.heise.de/download/chemical-calculator-1134265.html ). Diese Möglichkeiten der Interaktion und die dynamische Beeinflussung der Benutzeroberfläche möchte ich auch bei Online-Programmen haben.



Viele Grüß, Holger Buick


joerg
Avatar joerg
Fachinformatiker Anwendungsentwicklung
Content Gott (1941 Beiträge)
am 14.07.2012, 22:21 Uhr schrieb joerg

Hallo Holger

Du wenn bereits solche Zeichenfolgen in deiner Datenbank hast müsstest du die vorher ersetzen.

ß = ß
ä = ä
ü = ü
ö = ö
Ä = Ä
Ãœ = Ü
Ö = Ö

Wenn ich das mit den SQL Injections richtig überblicke sollten auch Prepared Statements mit den prozeduralen Anweisungen in der Mysql Extensision in PHP möglich sein.

www.peterkropff.de/site/mysql/prepared_statements.htm



Und für das Escapen bestimmter Zeichen existiert immer eine Möglichkeit.

Ich denke der Geschwindigkeitsvorteil von mysqli sollte für dich eher ausschlaggebend sein.

Persönlich habe ich mich dazu entschlossen auf PDO zu wechseln.

Ich denke für dich könnte OOP rein für die ganzen Datenbankabfragen durchaus Sinn ergeben.
Ich habe selbst lange dazu gebraucht mich überhaupt in das Thema reinzudenken aber wenn ich mir die Vorteile in Richtung Wartbarkeit anschaue macht das auch bei kleineren Projekten Sinn.

Muss ja nicht durchgängig sein das man OOP anwendet. Ich falle auch ganz gern mal in die prozedurale Welt zurück wenn mir halbwegs bewusst ist das ich diesen Kode wahrscheinlich nie woanders mehr verwenden kann.

Mir wird jetzt nicht bewusst warum OOP dich daran hindert Interaktion und Dynamik zu gewährleisten.

Gruß
Jörg


Zufällige Umleitung zu der Startseite einer meiner Domains
Meine ungewöhnlichen Tools

klaus_b
Avatar klaus_b
Er ernährt mich ;-)
Content Meister (328 Beiträge)
am 15.07.2012, 10:17 Uhr schrieb klaus_b

Hallo Holger,

ich stelle an dieser Stelle unsere Diskussion zurück, bis du das DB und Site relevante Thema abgeschlossen hast. Dieser Thread wird sonst zu unübersichtlich. Wir können gerne zu einem späteren Zeitpunkt weiter diskutieren. Einfach einen Thread beginnen

Nur so viel vorab: Ja, ich bewerte Domänen anhand verschiedener Kriterien mit den verschiedensten Methoden. Das ganze ist im Moment noch closed Beta.

Servus,
Klaus


klaus_b@.NET über alles was an .NET und C# Spass macht.

HBuick
Beginner (15 Beiträge)
am 15.07.2012, 21:53 Uhr schrieb HBuick

Hallo Jörg,

ich habe mal zum Test ein Tabellenfeld von latin1_swedish_ci auf eine UTF-8 Kollation umgestellt, ohne Probleme.

Dann habe ich in versucht von MySQL auf MySQLi umzustellen, zunächst nur prozedural. Weil ich viele verstreute mysqli_query() habe, in mehreren php-Dateien und Funktionen, die dann aber einen Parameter mehr benötigen, nämlich den Datenbanklink, habe ich dann $_SESSION[\'_db\'] eingestzt zur Ãœbergabe dieses Parameters, weiß allerdings nicht, ob das empfehlenswert ist. Soweit ich es zu laufen bekommen habe, konnte ich aber noch keine Erhöhung der Geschwindigkeit feststellen. Ich vermute, dass ich mit MySQLi mehrere Datenbanken zugleich öffnen kann und werde versuchen ganz auf prozedurale MySQLi umzustellen, nachher möglicherweise dann auf OOP-MySQLi. PDO habe ich mir noch nicht angeschaut.

joerg schrieb:

Mir wird jetzt nicht bewusst warum OOP dich daran hindert Interaktion und Dynamik zu gewährleisten.

Die zwei Aussagen über OOP und Dynamik wollte ich nicht im Zusammenhang schreiben.

Viele Grüße, Holger Buick




« zurück zu: Website vorstellen

Das Seitenreport Forum hat aktuell 5275 Themen und 36110 Beiträge.
Insgesamt sind 48360 Mitglieder registriert.