Jump to content

aadnk

Medlemmer
  • Content Count

    2990
  • Joined

  • Last visited

Community Reputation

6 :)

About aadnk

  • Birthday 04/16/1989
  1. GPS-koordinatene ser ikke ut til å være helt på ville veier, blant annet så jeg SSID'en til naboen på rett sted, men det er en del utenlandske GPS-punkter i datamengden. Disse er spredt rundt i Nederland, og konsentrert i et lite område i England. Hva Norge angår, ser det ut til å dekke mesteparten av landet.
  2. Jeg har laget et program som automatiserer denne oppgaven. Bare gi den panoid, ønsket zoom-nivå og evt. crop, så stifter den sammen alle kvadrantene for deg. Kildekoden til programmet legges ved under GPL-lisensen. StreetView.zip
  3. Det er nok lettest å ta screenshot av nettleseren, ettersom det såvidt jeg vet ikke er noen offisiel måte å laste ned bildene på. Men, om du du kan programmere (eller har god tid), er det jo mulig å bruke Street View-APIet direkte. En kort (og uoffisiel) gjennomgang er å finne her. Det er nokså enkelt å bruke dette APIet (foreløpig, i hvert fall), men du kan bare laste ned utsnitt på 512x512 piksler. For å pusle disse sammen til et stort panorama-bilde, må du enten gjøre det manuelt eller skrive et program. Si du vil laste ned hele dette bildet. Først trykker du på LINK oppe i høyre hjørne. Kopier så lenken inn i Notepad og finn frem til panoid-spørreparameteren (mellom panoid= og &), markert svart nedenfor: Du bruker følgende URL for å laste ned en av 512*512-kvadrantene: http://cbk0.google.com/cbk?output=tile&panoid=[PID]&zoom=[ZOOM]&x=[X]&y=[Y] Erstatt [PID] med panoid-verdien du fant ovenfor (i eksempelet XE6jJFqR4o4sAUscmyvWKg), sett [ZOOM] til 5, og sett inn [X]-verdier fra 0 til 25 og [Y] fra 0 til 12 (dvs. 26 * 13 = 338 kvadranter). Hvis du velger 14 i X og 6 i Y i eksempelet, får du et utsnitt av slottet: http://cbk0.google.com/cbk?output=tile&panoid=XE6jJFqR4o4sAUscmyvWKg&zoom=5&x=14&y=6
  4. Attributten VBFixedString, FileOpen, FileGet og FileClose ligger i Microsoft.VisualBasic og er først og fremst ment for å gjøre det mulig å automatisk oversette Visual Basic 6.0-programmer (du holder på med VB 7-10). Det er foretrukket at en bruker funksjoner i selve kjernen av .NET (System-navnerommet), men det er ikke i praksis et problem - VisualBasic-bakoverkompatibilitetslaget vil neppe bli fjernet fra .NET. Et slikt postsystem har sine fordeler, blant annet unngår du å måtte legge all informasjonen i RAM-en og det er mulig å endre størrelsen av felter uten å måtte skrive hele filen på nytt, men en er også begrenset av støttede datatyper og den øvre størrelsen i feltene. Disse innsparingene var muligens relevante i VB sin barndom, men i dag vil det være bedre og enklere å bare ha all informasjonen lagret i minne og skrive det ut til disken ved programslutt. I dag blir dette først et problem når man snakker om tusenvis/millioner av poster, og da burde en for lengst gått over til et skikkelig databasesystem med indeksering (Microsoft SQL Server, MySQL, Oracle, ect.). Men hvis antall poster er langt mindre enn dette, går det helt greit å åpne og lagre til en enkel filstruktur. I .NET er det lettest å oppnå dette med serialisering - nær automatisk konvertering fra objekter og til filer (gen. filstrømmer) og tilbake igjen. Dvs. at du kan lagre et objekt (eksempelvis en samling studenter) til en fil, og senere rekonstruerere dette objektet fra den samme filen. Først, gjør om strukturen din til en klasse uten attributtene: Public Class Student Public navn As String Public klasse As String Public epost As String Public født As Date End Class Deretter lager du et felt i formen (eller hovedklassen) som kan inneholde alle studentene. Det er også mulig å indeksere studentene slik at du f. eks. kan slå opp en student etter navn så som tallindeks: ' Dette er en array (som Dim s() As Students) som automatisk utvider seg ' Private studenter As New List(Of Student) Merk at syntaksen ovenfor krever .NET 2.0 eller nyere. Hvis du bruker en eldre versjon, vil du få feilmelding og du må du erstatte List(Of Student) med ArrayList. For å legge til en ny post, bruker du Add-metoden: Dim nyStudent As New Student With nyStudent .Navn = "Test" .Klasse = "Klasse" .Epost = "a@b.com" .Født = New Date(1990, 1, 1) End With Studenter.Add(nyStudent) Hvis du bruker .NET 4.0 kan du gjøre dette i en linje (evt. med en konstruktør før 4.0): studenter.Add(New Student With { navn = "Test", klasse = "Klasse", epost = "a@b.com", født = New Date(1990, 1, 1)} For å endre en student, kan du modifisere feltene direkte med en indeks: With studenter(0) ' første student ' .navn = "nytt navn" .klasse = "ny kasse" ' ect, ' End With Du bør også sjekke at indeksen er korrekt. Studenter.Count gir deg antall studenter i listen, hvor tallindeks 0 er første student og tallindeks Studenter.Count - 1 er siste student. Du kan åpne å søke i listen på to måter - enten ved å indeksere studentene etter f.eks. navn (dette er raskere dersom du har veldig mange studenter), eller du kan gå gjennom hver enkelt student om gangen, som du har forsøkt å gjøre i koden ovenfor. Dette kan du eksempelvis gjøre med en For-løkke: For i = 0 To studenter.Count - 1 ' Det vi er ute etter ' If studenter(i).navn = "Test" Then ' Last inn student etter gitt indeks ' LoadStudent(i) End If Next MessageBox.Show("Feil. Ingen student med det navnet") Hvis du har .NET 3.0 eller nyere, kan du bruke LINQ: ' Husk at LoadStudent-metoden må teste om indeksen er gyldig ' LoadStudent(studenter.FindIndex(Function(s) s.navn = "Test")) Endelig, for å serialisere (lagre) en liste med studenter, gjør du følgende: Try Using output As New IO.FileStream("data.dat", IO.FileMode.Create) ' Legg gjerne til Imports Runtime.Serialization.Formatters.Binary ' Dim Formater As New Runtime.Serialization.Formatters.Binary.BinaryFormatter Formater.Serialize(output, studenter) End Using Catch ex As Exception ' Vis feil ' MessageBox.Show(ex.ToString) End Try For å åpne, gjør du som så: If IO.File.Exists("data.dat") Then Try Using input As New IO.FileStream("data.dat", IO.FileMode.Open) ' Legg gjerne til Imports Runtime.Serialization.Formatters.Binary ' Dim Formater As New Runtime.Serialization.Formatters.Binary.BinaryFormatter studenter = Formater.Deserialize(input) End Using Catch ex As Exception ' Vis feil ' MessageBox.Show(ex.ToString) End Try End If
  5. Du kan også skrive potenser med hjelp av TeX: . Syntaksen på forumet er som på Wikipedia, men må settes inn med kodetaggen tex (med klammeparanteser) istedenfor <math>. Ditt stykke kan løses ved forenkle teller med regelen samt multiplisere med inversen av nevner oppe og nede (dvs. gjøre negative potenser til positive og omvendt) og endelig forekle: Edit: La til et ekstra steg i utregningen.
  6. Teoretisk sett er en plancklengde den minste mulige avstanden som, blant annet grunnet Heisenbergs usikkerhetsprinsipp i kvantemekanikken, vi kan i det hele tatt snakke om. Ettersom lyshastigheten er den øvrige hastighet, kan man utlede den øvrige tidsenheten - en plancktid () - etter tiden det tar for lys å tilbakelegge en plancklengde, for å finne den minste tidsenhet det tilsvarende gir mening å resonnere med. Hvis man så anvender newtonisk mekanikk (som sikkert blir riv ruskende galt) og antar at en partikkel aksellererer fra 0 til c på en plancktid, burde aksellerasjonen være: Men dere må nok ta dette med en stor klype salt. Planckenhetene har kun blitt utledet matematisk, og det er nå heller tvilsomt en kan anvende newtonisk mekanikk på partikler. Likevel vil jeg tro det i prinsippet burde være mulig å finne en maksimal aksellerasjon.
  7. Neida. Du kan unngå å kreve at programmet ditt kjører ved å la Windows' Scheduled tasks (noe àla CRON-jobber i UNIX) ta over logistikken. Dessverre er det ikke inkludert egne klasser for dette i .NET, men man kan alltids gå for en wrapper av Win32-APIet fra en tredjepart: http://www.codeproject.com/KB/cs/tsnewlib.aspx
  8. Hvis han vet hva som er godt for ham selv, burde han kunne velge den løsningen han kan forstå, eventielt droppe det hele. Ikke hvis man har å gjøre med mange søkeord. Da må man jo manuelt passe på at de regulære uttrykkene tar hensyn til alle subsequence-ene, og da jeg antok nøkkelordene trådstarter oppgav var eksempler, tenkte jeg først og fremst på en mer generell løsning.
  9. Du var nå såpass uklar i problembeskrivelsen at jeg umulig bare kunne gi deg "kommandoen" (koden), og i alle tilfeller vil jeg rent generelt at man faktisk lærer noe fra kodeeksemplene, og ikke bare kopiere kode og utnytte den tjenesten alle her yter gratis. I innlegget ovenfor nevnte jeg at ELSEIF-eksempelet KUN fungerer dersom koden kjøres èn gang. Legges koden inn i en knapp brukeren trykker på flere ganger, er dette såklart ikke tilstrekkelig, og en må dermed enten erstatte teksten etterhvert som den skrives i tekstboksen (mitt andre eksempel), eller ta høyde for indre sekvenser i resultatordene ved å rett og slett ignorere dem. Dette kunne man muligens ha gjort ved å lagre erstattede forekomster i en Array/liste, men da teksten kan endres radikalt av brukeren mellom hver knappetrykk, bør man i stedet bruke selve teksten som basis. Her kunne man godt brukt regulære uttrykk, men dette lar seg vanskelig automatisere for generelle søkeørd. Det beste er nok derfor å lage sin egen skreddesydde erstatningsfunksjon, så som følgende: Hvis du synes den er for lang, kan du jo prøve å forkorte den selv. Da vil du sannsynligvis lære en hel del, enten du lykkes eller ei.
  10. Dersom du ikke forventer å utføre erstatningsreglene om igjen, kan du forhindre at resultatene blir forandret ved å avslutte IF-setningene når en erstatning blir gjennomført; eksempelvis ved å lage èn lang IF-setning (via ElseIf): Men, om denne koden kjøres flere ganger (eksempelvis i RichTextBox1_TextChanged) burde du heller utføre erstatningen i inndataen:
  11. Kan man også referere til forumvedlegg?
  12. Det er jo klart hva som er teknisk mulig på ingen måte overlapper med hva språkdesignerene hadde til hensikt eller hva som kanskje er forsvarlig/tilrådelig i en applikasjon, men på en annen side er svært mange av teknikkene i en VB6-programmerers verktøyboks av slik art at det faller innunder en eller begge av disse kategoriene. Å modifisere WndProc-funksjonen, hvilket er ytterst normalt i C og ikke noe særlig betydelig i .NET, krever en noe omfattende hack (å endre funksjonspekeren i vinduets informasjonsstruktur til å peke til en egendefinert funksjon som kaller den originale funksjonen før eller etter den utvidede funksjonaliteten har blitt håndtert) som ofte kunne føre til krasj i IDEen (alternative metoder har omgått dette dog). Når mange Windows-meldinger og funksjoner går VB-programmer hus forbi om man ikke subclasser WinProc var dette heller ingen uvanlig metode å finne i større VB-programmer. Selv noe så simpelt som å implementere IEnumerable krevde subclassing (erstatte funksjonspekere i COM-objektets vtable) og egendefinerte type-libraries. Personlig benyttet jeg svært ofte, gjerne i bilde- eller strengprosessering, en hack for å omgå fraværet av eksplisitte pointers (ByRef i parametere er vel det nærmeste en kommer) i VB der Array-implementasjonens SafeArray-struktur ble modifisert slik at den referte til minneområdet en ville lese/skrive til. Man kunne til en viss grad tillate seg slik dyp integrering med maskintypen og operativsystem, i motsetning til eksempelvis Java, ettersom VB6 kun skulle kjøres under èn enkel plattform - x86 Windows 95/98/NT. Når språket og den virtuelle maskinen var utilstrekelig, var det derfor nødvendig (og ikke langt fra uvanlig) å ty til denslags. Men i .NET skyr jeg dette som ilden. Poenget er at hva som i utgangspunktet ble ansett som hacks etterhvert utviklet seg til general practice, og at cFuncCall i lys av alt dette ikke er en så stor hack som maskinkode blir ansett i tilsvarende språk. Funksjonaliteten er dessuten ikke så snever som du antyder - majoriteren av funksjonskall i Win32 benytter kun DWORD (og pointers), og dessuten støtter teknikken, i motsetning til VB6 (som kun støtter stdcall), andre calling conventions (cdecl). For øvrig, funksjonspekere er faktisk implemenert i VB6 - AddressOf-operatøren returnerer en modulprosedyres/-funksjons minneadresse i en parameter (slik at Win32-enumerasjon lar seg gjennomføres), men dette er på langt nær komparabelt til Delegates i .NET-rammeverket.
×
×
  • Create New...