Mehr

Wie schränke ich die Anzahl der Symbole im Featurenamen in CartoCSS ein?


Ich erstelle eine Touristenkarte mit CartoCSS in TileMill. Es gibt mehrere Zooms und ich möchte Marker der Objekte auf 15 Zoom und ihre Beschriftungen (Namen) auf 16 oder 17 Zoom anzeigen. Wenn die Anzahl der Symbole im Namen zu groß ist (zB mehr als 10), möchte ich sie mit 17 Zoom beschriften, wenn es weniger als 10 Symbole gibt, möchte ich sie mit 16 Zoom beschriften.

Könnte jemand helfen, wie man die Beschränkung der Anzahl der Symbole entweder in CartoCSS oder in SQL festlegt?


Sie können die Stringlänge mit CartoCSS nicht direkt berechnen, aber Sie können die Daten vorverarbeiten. Wenn Sie aus einer PostGIS-Datenbank lesen, fügen Sie ein neues Feld für die Etikettenlänge mit demZeichenlänge()Funktion in Postgres (docs).

Wenn Ihre Daten ein anderes Format haben (z. B. Shapefile), müssen Sie die Berechnung in einem anderen Programm (z. B. qGIS) durchführen.

Verwenden Sie dann einen CartoCSS-Filter (benennen Sie beispielsweise Ihr berechnetes Feldchar_count):

#label-layer[zoom=16][char_count < 10], #label-layer[zoom>=17]{… }

Typografie (Kartografie)

Typografie, als ein Aspekt des kartografischen Designs, ist das Handwerk des Entwerfens und Platzierens von Text auf einer Karte zur Unterstützung der Kartensymbole, die zusammen geografische Merkmale und deren Eigenschaften darstellen. Es wird auch oft Karte genannt Beschriftung oder Beschriftung, aber Typografie entspricht eher der allgemeinen Verwendung von Typografie. In der Geschichte der Karten bis heute war ihre Beschriftung von den allgemeinen Techniken und Technologien der Typografie abhängig.


Ein verwendetes Basisband-Signalmodell ist: $x(t)=sum_^N a_k p(t-kT)$ , wobei $a_k$ die Symbole sind (es gibt viele Typen, PSK, QAM, PAM zum Beispiel), $p(t)$ ist das Pulsformungsfilter, $T$ ist das Symbolperiode und $N$ ist die Anzahl der Symbole. Das Pulsformungsfilter begrenzt die Bandbreite von $x(t)$ .

Mehrere Abtastwerte pro Symbol zu haben, wird als Oversampling bezeichnet. Die Samples pro Symbol, $ ext$ , wird normalerweise nicht explizit ausgewählt, sondern wird aus der Symbolrate des Signals $F$ und der Abtastrate $F_s$ auf einer bestimmten Plattform bestimmt: $ ext = frac$. Ihre Aussage "Abtastungen pro Symbol ist Abtastrate" ist nicht richtig. Visuell "füllt" das Vorhandensein von mehr Samples pro Symbol das Symbol aus und lässt es glatter aussehen. Neben dem Pulsformungsfilter gibt es viele Gründe für das Oversampling. Zum Beispiel sind einige Algorithmen im Empfänger so ausgelegt, dass sie mit dem überabgetasteten empfangenen Signal arbeiten, während andere erwarten, dass sie mit den empfangenen Symbolen arbeiten.


Richtige Methode zum Einschränken von Texteingabewerten (z. B. nur Zahlen)

Ist es möglich, eine Eingabe zu implementieren, die es ermöglicht, nur Zahlen ohne manuelle Behandlung von event.target.value einzugeben?

In React ist es möglich, Werteeigenschaften zu definieren und anschließend wird die Eingabeänderung grundsätzlich an den Wert gebunden (nicht möglich, sie ohne Wertänderung zu ändern). Siehe Beispiel. Und es funktioniert ganz ohne Aufwand.

In Angular 2 ist es möglich, [value] zu definieren, aber es wird nur der Wert anfänglich gesetzt und danach wird die Eingabe nicht von den Änderungen verhindert.

Ich habe mit ngModel und [value] / (input) herumgespielt, siehe Beispiel.

Aber bei beiden Implementierungen gibt es ein wesentliches Problem:

  1. wenn Sie 10 eingeben (Modellwert ist 10 Eingabewert ist 10) - richtig
  2. wenn Sie danach 10d eingeben (Modellwert ist 10 - nicht geändert, alle Nicht-Ziffern wurden entfernt Eingabewert ist 10d) - falsch, weil der Modellwert derselbe ist wie zuvor
  3. wenn Sie 10d3 eingeben - (Modellwert ist 103 Eingabewert ist 103) - richtig

Wie man diese einfache (auf den ersten Blick) Komponente macht, ohne event.target.value manuell zu behandeln.

AKTUALISIEREN Ich suche hier nicht nach dem nativen HTML5-Element input[number]. Die Zahleneingabe hier dient nur als Beispiel - es könnte viel mehr Aufgaben geben, wenn ich den Eingabetext einschränken muss.

Außerdem hindert mich input[number] nicht daran, 10ddd einzugeben und 2) (weniger wichtig) enthält Pfeile, die ich nicht benötige.

Und das Problem hier ist zu verhindern Benutzer daran, etwas über die eingeschränkten Werte hinaus einzugeben, anstatt ermöglichen etwas eingeben und validieren es danach


Anstatt zu versuchen, den Zugriff auf einen Ordner einzuschränken, ist es möglicherweise einfacher, Ihre Dateien als eingebettete Ressourcen hinzuzufügen. Auf diese Weise sind sie Teil Ihrer ausführbaren Datei und die Benutzer können sie nicht löschen.

Legen Sie die Fragen-Binärdatei in einen Unterordner und machen Sie sie für jeden Benutzer außer den Administratoren schreibgeschützt. Dies ist kein Programmierproblem, sondern ein Verwaltungsproblem.

Nach den Kommentaren haben Sie eine interessante Reihe von Einschränkungen.

Für das Web ist dies relativ einfach und Sie können den Benutzerzugriff auf Anwendungs-/Datendateien auf verschiedene Weise einschränken - dies ist (oder sollte) inhärent bei Webservern/Anwendungen (es ist sicherlich in asp.net integriert).

Für eine Desktop-Anwendung ist es jedoch etwas interessanter und hängt davon ab, wie die Anwendung installiert/ausgeführt werden soll - wenn der Benutzer Admin-Rechte auf dem Computer hat, können Sie nur sehr wenig tun, um die Manipulation von Dateien zu verhindern. Wenn dies nicht der Fall ist, benötigen Sie einen Administrator, um die Anwendung bereitzustellen, und Sie haben andere interessante Probleme.

Da Sie nach einer Lösung suchen, um auf beiden Plattformen zu arbeiten, würde ich tun, was @Andy vorschlägt Um den Inhalt viel schwieriger zu manipulieren, können Sie auch einen Fingerabdruck (zum Beispiel MD5) und eine Verschlüsselung hinzufügen. Wenn Sie verschiedene Fragesätze haben möchten, können Sie diese einfach in eine separate .dll einbetten und es gibt verschiedene Möglichkeiten, die .dlls zur Laufzeit abzurufen.


8 Antworten 8

Es gibt ein paar Dinge, die Sie tun können, um die Verwendung der Anwendung auf einen bestimmten Bürostandort und bestimmte Geräte zu beschränken, obwohl, wie andere Antworten darauf hinweisen, keine davon absoluten Schutz bietet

  • Richten Sie eine Firewall vor der Anwendung ein, um die für den Zugriff auf die Anwendung zulässigen IP-Adressen auf den externen IP-Adressbereich des Clients zu beschränken. Die meisten Unternehmen haben statische IP-Adressen auf ihren Routern mit Internetzugriff, und wenn Sie die Anwendung so einstellen, dass sie nur über diese IP-Adressen zugänglich ist, ist es für eine nicht autorisierte Person schwieriger, darauf zuzugreifen, es sei denn, sie befindet sich in ihrem Büro. TBH, das klingt nach dem Ansatz, der am besten für Ihre Kundenanforderungen geeignet ist
  • Sie können Clientzertifikate auch auf autorisierten Geräten verwenden. Wie @adnan darauf hinweist, ist es möglicherweise möglich, diese auf einen anderen Computer zu verschieben, aber dazu müsste der Angreifer entweder ein Mitarbeiter sein oder unbefugten Zugriff auf eines seiner Systeme haben
  • vielleicht könnte man dies als detektivische Kontrolle mit Browser-Fingerprinting (z.B. panopticlick ) kombinieren. Erstellen Sie eine Liste von Geräten und deren Fingerabdruck. Wenn das Client-Zertifikat auf einem Gerät verwendet wird, das nicht mit dem Fingerabdruck übereinstimmt, können Sie es blockieren.

Wie gesagt, das sind keine absoluten Aussagen, aber nichts in der Sicherheit ist. Wenn Ihr Kunde nur danach sucht, Leute davon abzuhalten, ihre Site von außerhalb des Unternehmens zu sehen, würde ich den Ansatz mit dem Quell-IP-Adressfilter wählen.

Sie müssen die Web-App lediglich auf einem Server im Intranet hosten, der nicht mit dem Internet verbunden ist.

Durch geeignete Routing- und Firewall-Maßnahmen sollte sichergestellt werden, dass niemand, der nicht mit dem lokalen Netzwerk verbunden ist, Zugriff auf die Web-App hat.

Wenn Personen außerhalb des Netzwerks Zugriff auf die Web-App benötigen, lassen Sie sie eine VPN-Verbindung zu Ihrem lokalen Netzwerk einrichten.


Versuchen Sie, dies könnte für Sie funktionieren

Wenn Sie Leerzeichen hinzufügen möchten, können Sie nach der letzten Ziffer Leerzeichen einfügen.

Oder wenn Sie den einfachen Weg bevorzugen:

Überprüfen Sie diesen Link, der zeigt Wie schränke ich Sonderzeichen aus einem Android-EditText-Feld ein?

Versuchen Sie diesen Code android:digits="abcde. 012345789" Ich denke, dies ist der einfachste Weg. Hoffe, dies hilft Ihnen.

Es ist spät, kann aber für andere hilfreich sein. Anstatt programmatisch können Sie das XML-Attribut verwenden. Es kann vorkommen, dass Sie im Single-Layout viele EditTexte haben, von denen Sie Sonderzeichen nur in einem EditText einschränken möchten. Die Definition in XML wird Ihnen also helfen. Hier ist der Code, um Sonderzeichen einzuschränken, indem sie nur Alphabete und Zahlen wie unten eingeben dürfen

Für diejenigen, die beim Hinzufügen von Leerzeichen auf Probleme stoßen könnten, fügen Sie bitte ein Leerzeichen mit allen Alphabeten hinzu. Unten ist ein Beispiel. Außerdem sollten Sie wissen, dass der Benutzer in diesem Fall keine neue Zeile hinzufügen kann.

Zuerst müssen Sie DigitsKeyListener hinzufügen, um Zeichen zuzulassen, und dannRawInputType setzen, um das Textfeld zu bearbeiten


So machen Sie die Funktionspalette für den Personalisierungstool effektiver

Ein guter Funktionsumfang hilft dem Personalizer, die Aktion vorherzusagen, die die höchste Belohnung einbringt.

Ziehen Sie in Betracht, Funktionen an die Personalisierungsrang-API zu senden, die diesen Empfehlungen folgen:

Verwenden Sie kategoriale und Zeichenfolgentypen für Features, die keine Magnitude sind.

Es gibt genügend Funktionen, um die Personalisierung voranzutreiben. Je zielgenauer die Inhalte sein müssen, desto mehr Funktionen werden benötigt.

Es gibt genug Funktionen von diversen Dichten. Eine Funktion ist dicht wenn viele Elemente in wenigen Buckets gruppiert sind. Tausende von Videos können beispielsweise als "Lang" (über 5 Minuten lang) und "Kurz" (unter 5 Minuten lang) klassifiziert werden. Das ist ein sehr dicht Feature. Andererseits können die gleichen Tausenden von Elementen ein Attribut namens "Titel" haben, das von einem Element zum anderen fast nie den gleichen Wert hat. Dies ist ein sehr nicht dichtes oder spärlich Feature.

Die Funktionen mit hoher Dichte helfen dem Personalizer, das Lernen von einem Element zum anderen zu extrapolieren. Wenn es jedoch nur wenige Funktionen gibt und diese zu dicht sind, versucht der Personalizer, Inhalte mit nur wenigen Buckets zur Auswahl zu treffen.

Funktionsumfang verbessern

Analysieren Sie das Benutzerverhalten, indem Sie eine Offline-Auswertung durchführen. Auf diese Weise können Sie sich vergangene Daten ansehen, um zu sehen, welche Funktionen stark zu positiven Belohnungen beitragen, im Vergleich zu denen, die weniger beitragen. Sie können sehen, welche Funktionen Ihnen helfen, und es liegt an Ihnen und Ihrer Anwendung, bessere Funktionen zu finden, die Sie an Personalizer senden können, um die Ergebnisse noch weiter zu verbessern.

Die folgenden Abschnitte sind gängige Vorgehensweisen zum Verbessern von Funktionen, die an Personalizer gesendet werden.

Features dichter machen

Sie können Ihre Feature-Sets verbessern, indem Sie sie bearbeiten, um sie größer und mehr oder weniger dicht zu machen.

Ein sekundengenauer Zeitstempel ist beispielsweise ein sehr spärliches Feature. Es könnte dichter (effektiver) gemacht werden, indem die Zeiten in "morgens", "mittags", "nachmittags" usw.

Standortinformationen profitieren in der Regel auch von der Erstellung breiterer Klassifikationen. Eine Breitengrad-Längengrad-Koordinate wie Breite: 47,67402° N, Länge: 122.12154° W ist beispielsweise zu präzise und zwingt das Modell, Breiten- und Längengrad als unterschiedliche Dimensionen zu lernen. Wenn Sie versuchen, basierend auf Standortinformationen zu personalisieren, ist es hilfreich, Standortinformationen in größeren Sektoren zu gruppieren. Eine einfache Möglichkeit, dies zu tun, besteht darin, eine geeignete Rundungsgenauigkeit für die Lat-Long-Zahlen zu wählen und Breitengrad und Längengrad zu "Bereichen" zu kombinieren, indem sie zu einer Zeichenfolge zusammengefasst werden. Eine gute Möglichkeit zum Darstellen von 47,67402° N, Länge: 122,12154° W in Regionen mit einer Breite von etwa einigen Kilometern wäre beispielsweise "location": "34.3 , 12,1"

Erweitern Sie die Feature-Sets mit extrapolierten Informationen

Sie können auch mehr Funktionen erhalten, indem Sie an unerforschte Attribute denken, die aus bereits vorhandenen Informationen abgeleitet werden können. Ist es beispielsweise bei der Personalisierung einer fiktiven Filmliste möglich, dass ein Wochenende im Vergleich zu einem Wochentag ein anderes Verhalten der Benutzer hervorruft? Zeit könnte erweitert werden, um ein "weekend" oder "weekday" Attribut zu haben. Lenken nationale Kulturfeiertage die Aufmerksamkeit auf bestimmte Filmtypen? Ein "Halloween"-Attribut ist beispielsweise an Stellen nützlich, an denen es relevant ist. Kann es sein, dass Regenwetter für viele Menschen einen erheblichen Einfluss auf die Filmwahl hat? Mit Zeit und Ort könnte ein Wetterdienst diese Informationen bereitstellen und Sie können sie als zusätzliche Funktion hinzufügen.

Erweitern Sie den Funktionsumfang mit künstlicher Intelligenz und kognitiven Diensten

Künstliche Intelligenz und einsatzbereite Cognitive Services können eine sehr leistungsstarke Ergänzung des Personalizers sein.

Durch die Vorverarbeitung Ihrer Artikel mit KI-Diensten können Sie automatisch Informationen extrahieren, die wahrscheinlich für die Personalisierung relevant sind.

  • Sie können eine Filmdatei über Video Indexer ausführen, um Szenenelemente, Text, Stimmung und viele andere Attribute zu extrahieren. Diese Attribute können dann verdichtet werden, um Merkmale widerzuspiegeln, die die ursprünglichen Elementmetadaten nicht aufwiesen.
  • Bilder können durch Objekterkennung, Gesichter durch Sentiment usw.
  • Informationen im Text können durch Extrahieren von Entitäten, Stimmungen, Erweitern von Entitäten mit Bing-Wissensgraphen usw.

Sie können mehrere andere Azure Cognitive Services verwenden, wie z


java.util.Scanner kann mit den hasNextXXX-Methoden bereits prüfen, ob das nächste Token von einem bestimmten Muster/Typ ist.

Hier ist ein Beispiel für die Verwendung von boolean hasNext(String pattern), um zu überprüfen, ob das nächste Token nur aus Buchstaben besteht, indem der reguläre Ausdruck [A-Za-z]+ verwendet wird:

Bitte Buchstaben eingeben:
&#@#$
Nein, das ist es nicht!
123
Nein, das ist es nicht!
James Bond
Vielen Dank! Habe James

Um zu überprüfen, ob das nächste Token eine Zahl ist, die Sie in int konvertieren können, verwenden Sie hasNextInt() und dann nextInt() .

Verwandte Fragen

Dies ist wahrscheinlich am einfachsten mit einem regulären Ausdruck. Hier ist ein Beispielcode:

Sie sollten wahrscheinlich Methoden von "getAlphaInput" und "getNumericInput" schreiben, die die entsprechende Schleife von prompt/fetch/check ausführen, bis die Eingabe korrekt ist. Oder möglicherweise nur getInput(Pattern), um zu vermeiden, ähnlichen Code für unterschiedliche Muster zu schreiben.

Sie sollten auch Anforderungen in Bezug auf das erarbeiten, was als "Buchstabe" gilt - das obige gilt nur für A-Z und A-Z. wenn Sie auch mit Akzenten usw. umgehen müssen, sollten Sie sich die Pattern-Dokumente genauer ansehen und entsprechend anpassen.

Beachten Sie, dass Sie auch eine Regex verwenden können, um Dinge wie die Länge der Zeichenfolge zu überprüfen. Sie sind sehr flexibel.


Glossar

Lösungen

Antworten auf Fragen zum Selbsttest

    1. Ein Patent ist eine von der Regierung erzwungene Eintrittsbarriere.
    2. Dies ist keine Eintrittsbarriere.
    3. Dies ist keine Eintrittsbarriere.
    4. Dies ist eine Eintrittsbarriere, die jedoch nicht von der Regierung erzwungen wird.
    5. Dies ist eine Eintrittsbarriere, die jedoch nicht direkt von der Regierung durchgesetzt wird.
    1. Dies ist eine von der Regierung erzwungene Eintrittsbarriere.
    2. Dies ist ein Beispiel für ein Regierungsgesetz, aber vielleicht ist es keine große Eintrittsbarriere, wenn die meisten Menschen den Sicherheitstest bestehen und eine Versicherung abschließen können.
    3. Marken werden von der Regierung durchgesetzt und stellen daher eine Eintrittsbarriere dar.
    4. Dies ist wahrscheinlich keine Eintrittsbarriere, da es verschiedene Möglichkeiten gibt, reines Wasser zu erhalten.
    5. Dies ist eine Eintrittsbarriere, die jedoch nicht von der Regierung erzwungen wird.