Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
rád bych dopřál uživateli komfort a tedy umožnil mu psát pouze částečnou URL. Problém je, že k tomu potřebuji plné namespace System.Web - tedy neklientský framework. Dělám to ve WPF, takže to by nefungovalo. Tak jsem založil knihovnu, kde jsem vyřešil druhý problém (to, že to pracuje pouze se statickými daty) tak, že z nestatické třídy přesměruji požadavek na statickou třídu. Nejsem si jist, jestli je to dobré řešení, každopádně mým hlavním problémem je nekompabilita mezi klientskou verzí a plnou verzí frameworku. Jak mám tedy použít tuto knihovnu ve svém WPF projektu? Děkuji.

 
Odpovědět 11.9.2012 10:04
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Co si představuješ pod pojmem "částečné URL"? Pokud jen relativní URL, tak kvůli tomu snad žádnou knihovnu nepotřebuješ.

Nahoru Odpovědět 11.9.2012 10:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Samozřejmě, že myslím relativní URL - když to chceš odborně, tak dobrá - chci převést relativní URL na absolutní URL...

Tak vysvětlení pro tebe - potřebuji k tomu použít jiný framework - a ve WPF projektu mi to bude dělat problémy - ani by to snad nešlo. Takže jsem založil další projekt - a knihovna se podle mě k tomuto účelu hodí. V ní jsem vyřešil problém se statickými daty - a stačí ji jen dostat do toho WPF projektu... Takže ji potřebuji...

Editováno 11.9.2012 10:51
 
Nahoru Odpovědět 11.9.2012 10:49
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Tak tomu rozumím ještě méně. Nikdy jsem netušil, že by někdo mohl potřebovat na "částečné URL" nějaký framework. Nestačilo by zavolat nějakou standardní funkci?

Jenom stále nevím, co si představuješ pod pojmem "částečné URL". Znám jen absolutní a relativní. Znám i všechny komponenty URL, ale fakt netuším, co je to "částečné URL". Vlastně všechna URL jsou částečná. Téměř nikdo nepoužívá kompletní URL.

Nahoru Odpovědět 11.9.2012 10:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Napsal jsem to tam odborně, co víc chceš... Co si představuješ pod pojmem standartní funkce? Jenom potřebuji použít v projektu plný framework, ne klientský. Jak píši, nejsou kompatibilní, ...

 
Nahoru Odpovědět 11.9.2012 11:46
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Co víc chci? Aby ti na ten tvůj dotaz konečně někdo odpověděl.

Nepsal jsem o žádné standartní, ale o standardní funkci. To znamená funkci, která je součástí programovacího jazyka, ve kterém píšeš svou aplikaci, případně nějaké jeho knihovny.

Nahoru Odpovědět 11.9.2012 11:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Pak to tvé podmínky splňuje - jen potřebuji jiný framework - který je součástí .NET...

 
Nahoru Odpovědět 11.9.2012 12:42
Avatar
matesax
Redaktor
Avatar
matesax:

Problém se mi zatím nepodařilo efektivně vyřešit. Aktuální podoba:

private string[] prefixes = { "https://", "http://", "https://www.", "http://www." };

...

public static bool UrlExists(string url)
{
        try
    {
                WebRequest.Create(new Uri(url)).GetResponse();

                return true;
    }
        catch
        {
                return false;
        }
}

public string GetAbsoluteURL(string path)
{
        this.Path = path;

        return GetAbsoluteURL();
}

public string GetAbsoluteURL()
{
        if (UrlExists(Path))
                return Path;
        else
        {
                foreach (string prefix in prefixes)
                        if (UrlExists(prefix + Path))
                                return prefix + Path;
        }

        return null;
}

Což sice funguje, ale třeba facebook.com to nenajde. Čily opravdu by se nedalo postupovat tak, jako prohlížeče postupují? Děkuji.

Editováno 16.1.2013 20:13
 
Nahoru Odpovědět 16.1.2013 20:10
Avatar
mtecl
Neregistrovaný
Avatar
mtecl:

Pokud to má jít po webech, tak asi do podoby http://www.... můžeš doplňovat vždycky. Z http na https se přesměrovává až podle odpovědi serveru.

_____________­________________________­_______________
Ten tvůj "web pinger" je slušná čuňárna - jestli uživatel chce na "http://www.sez­nam.cz" a napíše "seznam.cz", dohrabeš se ke správné url po pěti requestech?! Víš, že někdy může request trvat třeba i pár vteřin?
Nehledě teda na spojování stringů plusem, navíc úplně stupidně dvakrát po sobě. Divím se, že někdo jako ty, kdo dělal parser a kompiler na několik objektově orientovaných jazyků pro několik OS, klidně dělá instaci konstaního pole stringů pro každou instanci třídy. Tok kódu zásadně neřídíme pomocí try-catch! Od odborníka tvého formátu bych čekal víc, chlapče...

 
Nahoru Odpovědět 16.1.2013 21:04
Avatar
Odpovídá na matesax
Luboš Běhounek (Satik):

Uh, ke kodu se radsi vyjadrovat nebudu, uz to udelal mtecl.

Ja bych to resil asi tak, ze bych zjistoval, zda slovo ma alespon 4 znaky (nejkratsi adresa muze byt ve tvaru "a.cz") a obsahuje nejakou tecku, ktera neni uplne na konci ani uplne na zacatku.
Pokud ano, zjistil bych, jestli za nejakou z tech "vnitrnich" tecek je string, ktery odpovida nejake existujici domene prvniho radu. Pokud ano, tak bych to slovo vzal a zacal ho zkoumat odpredu - jestli obsahuje protokol, tak uz bych ho nechal byt, jestli chybi protokol, doplnil bych klasicky http (nejsem vestec, abych hadal protokol za uzivatele, pokud ho nenapise) a pak zjistil, jestli tam je domena tretiho radu a pripadne doplnil www...

O moc lip to asi uz resit nepujde...

Editováno 16.1.2013 22:08
Nahoru Odpovědět 16.1.2013 22:07
:)
Avatar
matesax
Redaktor
Avatar
matesax:

Jde mi o to, že prohlížeče weby vyhledávají - nedosazují možné předpony...

Jinak - je to takto, jelikož https upřednostňuji...

Editováno 16.1.2013 22:13
 
Nahoru Odpovědět 16.1.2013 22:12
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Prohlížeče weby nevyhledávají. Pouze si z DNS zjistí IP adresu podle domény v URL.

Ta aktuální podoba vyhledávání je úplně špatně. Ten objekt nemá vracet URL, ale deskriptor otevřeného spojení.

Nahoru Odpovědět 17.1.2013 8:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Když budu vědět jak...

 
Nahoru Odpovědět 17.1.2013 12:17
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

A co tedy dělá

WebRequest.Create(new Uri(url)).GetResponse();

Vůbec nepoužíváš navatovou hodnotu. Přesně to bys měl vrátit returnem.

Nahoru Odpovědět 17.1.2013 12:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

C# sice neumím, ale viděl bych to asi takto:

private string[] prefixes = { "", "https://", "http://", "https://www.", "http://www." };

...

public WebRequest OpenURL(string path) {
    foreach (string prefix in prefixes) {
        try {
            return WebRequest.Create(new Uri(prefix + path)).GetResponse();
        } catch (WebException e) {
        }
    }
    throw new OpenURLException("Nepodařilo se otevřít " + path);
}
Editováno 17.1.2013 13:06
Nahoru Odpovědět 17.1.2013 13:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
lcet.m
Člen
Avatar
lcet.m:

Pánové, takhle to fakt nejde... Co když někdo napíše "https://face­book.com"? Chrome si s tím poradí, ale vám vyletí výjimka "Nepodařilo se otevřít /…facebook.com".

Buď si Matesex bude muset přiznat, že tohle je nad jeho síly a uživatel prostě bude url zadávat přesně, nebo to chce něco si o formátu url přečíst, rozsekat na komponenty a pak doplnit do funkčního stavu.

http://cs.wikipedia.org/…urce_Locator

 
Nahoru Odpovědět 17.1.2013 14:55
Avatar
Kit
Redaktor
Avatar
Odpovídá na lcet.m
Kit:

Všiml sis těch prázdných uvozovek, které jsem připsal na začátek pole prefixes?

Nahoru Odpovědět 17.1.2013 15:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:
using System.Net;
using System;

namespace RunsWolf
{
        public class URL
        {
                private string[] prefixes = { "", "http://", "http://www." };

                public string Path { get; set; }

                public URL ()
                {
                }

                public URL (string path)
                {
                        this.Path = path;
                }

                public WebResponse OpenURL(string path)
                {
                        this.Path = path;

                        return OpenURL();
                }

                public WebResponse OpenURL()
                {
                        foreach (string prefix in prefixes)
                                try
                                {
                        return WebRequest.Create(new Uri(prefix + Path)).GetResponse();
                        }
                                catch { }

                        throw new WebException("Nepodařilo se otevřít " + Path);
                }
        }
}
 
Nahoru Odpovědět 17.1.2013 18:20
Avatar
Odpovídá na matesax
Luboš Běhounek (Satik):

WebRequest může trvat i několik vteřin, takže pokud cíl prostě neexistuje, tak vyzkoušení všech tří předpon zabere tuším 15 sekund (pokud je defaultní timeout 5 sekund, nejsem si jistý).

Proto bych se snažil eliminovat počet pokusů na minimum a nejdříve si tu adresu zpracovat a zjistit, která část tam je a která není - nemá cenu před adresu lepit "http://", pokud už tak ta adresa začíná.

Nahoru Odpovědět 17.1.2013 18:31
:)
Avatar
matesax
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
matesax:

No 5 sekund to asi netrvá, jelikož nejdéle jsem čekal oněch 5 sekund - a to nemám nejrychlejší připojení... Takže těžko říci, zda rozebírat ten string nevyjde na stejno. Především - ty zadáváš absolutní URL? Právě proto to dělám - protože s ní nepočítám... Ale ještě si pořád hraji - kdo ví, na co narazím...

 
Nahoru Odpovědět 17.1.2013 18:45
Avatar
lcet.m
Člen
Avatar
Odpovídá na Kit
lcet.m:

Nevšim. Ale - ty prázdné uvozovky jsou teda zrovna v tom případě co jsem napsal funkční, nicméně třeba pro vstup "https://seznam.cz" už ne. Prostě tímhle způsobem je to blbost.

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            foreach (var tst in GetTestEntries())
            {
                var repaired = RepairUrl(tst);
                Console.WriteLine("{0} -> {1}", tst, repaired);

                PrintResponse(repaired);
                Console.WriteLine();
            }

            Console.ReadLine();



        }

        private static string RepairUrl(string uri)
        {
            if (string.IsNullOrWhiteSpace(uri))
                throw new ArgumentException();

            var protocol = "http";
            uri = uri.Trim();

            var protoInx = uri.IndexOf("://");
            if (protoInx > -1)
            {
                protocol = uri.Substring(0, protoInx);
                uri = uri.Substring(protoInx + 3);
            }

            var sb = new StringBuilder();

            sb.Append(protocol);
            sb.Append("://");
            if (!uri.ToLower().TrimStart().StartsWith("www."))
                sb.Append("www.");
            sb.Append(uri);

            return sb.ToString();
        }

        private static IEnumerable<string> GetTestEntries()
        {
            yield return "seznam.cz";
            yield return "https://seznam.cz";
            yield return "http://seznam.cz";
            yield return "www.google.com";
            yield return "http://google.com";
            yield return "facebook.com";
            yield return "google.cz#q=matesax";

        }

        private static void PrintResponse(string url)
        {
            var rq = WebRequest.Create(url);
            using (var rdr = new StreamReader(rq.GetResponse().GetResponseStream()))
                Console.WriteLine(rdr.ReadLine());
        }
    }
}
 
Nahoru Odpovědět 17.1.2013 19:43
Avatar
lcet.m
Člen
Avatar
Odpovídá na matesax
lcet.m:

Ono to tak dlouho netrvá, protože WebRequest není mentál a většinou přijde na chybný formát URL ještě před zkoušením requestu.

 
Nahoru Odpovědět 17.1.2013 19:46
Avatar
Kit
Redaktor
Avatar
Odpovídá na lcet.m
Kit:

Hlavně je blbost doplňovat to "www.".

Už tady bylo napsáno, že by bylo lepší URL parsovat a chybějící údaje doplnit, než takto pitomě rozšiřovat.

Nahoru Odpovědět 18.1.2013 9:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

A tohle má být co?

catch { }

Za to se vyhazuje z práce.

Jinak jako jediný přínos tvého zápisu vidím jeho zbytečné prodloužení. Zřejmě proto, aby byl méně přehledný.

Nahoru Odpovědět 18.1.2013 10:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na lcet.m
Kit:

Co vlastně dělá metoda RepairUrl? Nedala by se využít třída Uri? Přinejhorším bych URL rozparsoval, doplnil údaje a složil. Takové harakiri na řetězcích by se s tím dělat nemělo.

Nahoru Odpovědět 18.1.2013 10:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Proč by se za to mělo vyhazovat z práce? I já občas použiju prázdný catch.
Pokud je to něco, co nemá smysl logovat nebo nějak řešit a je to tam jen kvůli tomu, aby ti kód nevyskočil ven z funkce v případě vyjímky, pak na tom není nic špatného.

Nahoru Odpovědět 18.1.2013 10:42
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Vždycky bys měl vědět, kterou výjimku chceš zahodit. Neočekávanou výjimku bys měl vždy postoupit do dalších vrstev.

Nahoru Odpovědět 18.1.2013 10:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Zrovna u WebRequest.Create by mi v tomhle případě bylo celkem fuk, která z vyjímek byla vyhozena ( http://tinyurl.com/a9vmpms ), protoze realne tu muzu narazit vicemene jen na UriFormatException (maximalne pro jednu adresu z tisice jeste na SecurityException) a obe pro me znamenaji to same - tahle adresa je pro me nepouzitelna, zkousim dal.

Editováno 18.1.2013 11:16
Nahoru Odpovědět 18.1.2013 11:15
:)
Avatar
lcet.m
Člen
Avatar
Odpovídá na Kit
lcet.m:

Nevím na který můj post je to odpověď, ale přesně parsování a doplnění do kompletního stavu je to, co ten můj kód dělá.

Co se týče pužití Uri vs. harakiri, třída Uri, pokud něco takového umí, uvnitř zřejmě musí dělat +- totéž. (Jen na rozdíl ode mě možná kluci z MS uměj dobře regexy, no :) ). Samořejmě je vždy lepší použít něco nativního z .NETu, ale to už se mi zas pro Matesaxe zkumat nechtělo. Každopádně jak je z toho kódu vidět, repairUrl umí doplnit všechny běžné formáty nekompletní url na formát akceptovaný WebRequest-em. Je to asi lepší, než původní Matesaxův čuninec se zkoušením špatných variant a řízeím kódu výjimkou.

 
Nahoru Odpovědět  +1 18.1.2013 11:23
Avatar
lcet.m
Člen
Avatar
lcet.m:

(holky z MS amozřejmě taky, aby to bylo džendr)

 
Nahoru Odpovědět 18.1.2013 11:24
Avatar
Kit
Redaktor
Avatar
Odpovídá na lcet.m
Kit:

Právě to jsem měl na mysli. Třídy a funkce, které jsou součástí jazyka, jsou obvykle tak dobře vytuněny, že by byl hřích toho nevyužít.

Nahoru Odpovědět 18.1.2013 14:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Vytuněny po stránce funkcí, po stránce rychlosti to občas docela pokulhává :)

Nahoru Odpovědět 18.1.2013 14:45
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Zrovna třída Uri řeší většinu z toho, co se tady matesax snaží dělat opisem. Pokud někdo vybere nevhodnou metodu nebo ji použije špatně, tak to mívá dopad nejen na rychlost, ale jazyk za to nemůže.

Nahoru Odpovědět 18.1.2013 15:15
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Před pár lety jsem zkoušel rychlosti některých komponent a třeba Funce Sort u Listu (zkoušel jsem to asi na 100 000 Stringů) byla 10x pomalejší než má vlastní implementace.

Pro nějaké malé množství dat to samozřejmě je fuk, ale pro větší balíky dat už to je pomalé a je lepší použít implementaci vlastní.

Nahoru Odpovědět 18.1.2013 15:27
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Zřejmě proto, že tvá vlastní implementace zanedbávala NLS. Který algoritmus jsi použil?

U větších balíků dat bych se s řazením asi raději spolehl na databázi. Bývá to v nich optimalizováno velmi dobře. Na objektový jazyk žádná práce nezbude, takže pak už není co optimalizovat :)

Nahoru Odpovědět 18.1.2013 15:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

No a to jak? Jelikož já nenašel žádnou užitečnou metodu...

 
Nahoru Odpovědět 18.1.2013 16:28
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Tak jsem to nasel a je to jen 4x rychlejsi, nevim uz, jestli jsem to nezkousel predtim na jinem PC, ale mel jsem za to, ze to bylo skoro 10x :)

Ani nevim, jestli se NLS u bezneho porovnani stringu pouziva, ja to ignoruju, radim jen podle pozice znaku v (rozsirene) ASCII tabulce.
Algoritmus mam nejakej vlastni, ani vlastne nevim, jakej, ale asi to bude nejaka variace na BucketSort/Ra­dixSort.

Psal jsem to v dobach, kdy jsem zacinal s C#, ted bych to zas napsal uplne jinak :)

Nahoru Odpovědět 18.1.2013 16:59
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Radix sort je skvělý algoritmus, zejména na obrovské množství dat, ale pro obecné použití se moc nehodí. Je možné, že jsi s ním měl lepší výkon, než s obecným algoritmem.

Bucket sort vypadá také zajímavě.

V Javě/C# se NLS běžně používá a proto může být řazení pomalejší. Ale že by až tak moc? Vyzkouším. Nic to však nemění na tom, že na řazení velkého objemu dat mám raději DB :)

Nahoru Odpovědět 18.1.2013 17:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Už v konstruktoru Uri se přece dá použít druhý parametr, který doplní chybějící údaje.

Nahoru Odpovědět 18.1.2013 17:15
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

No je tam leda tak doplnění relativní URL. Ale hlavně - ne všechny weby jedou na www... Čily stejně to budu muset nějak zjistit - jak? (Když ne pokusem načíst stránku...)

 
Nahoru Odpovědět 18.1.2013 17:43
Avatar
lcet.m
Člen
Avatar
lcet.m:

Nechceš nám Matesi prozradit, co přesně děláš? Browser to předpokládám nebude...

 
Nahoru Odpovědět 19.1.2013 0:17
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Je dobré do sekundární URL zadat předchozí URL.

Nahoru Odpovědět 21.1.2013 8:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na lcet.m
matesax:

No nebude - již je... :)

Aktuálně dělám UI pro konzoli - boxy, panely,... Hodlám sem vše dát.

Editováno 21.1.2013 9:04
 
Nahoru Odpovědět 21.1.2013 9:04
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 43 zpráv z 43.