Mehr

Hat jemand Tipps, um herauszufinden, warum eine Vektorebene in Pyqgis nicht geladen wurde?

Hat jemand Tipps, um herauszufinden, warum eine Vektorebene in Pyqgis nicht geladen wurde?


Dies ist eine allgemeine Frage. Ich gehe durch den pyqgis-Code und die Ebene isValid() ist immer False. Ich sehe keine Fehlermeldungen, die einen Grund dafür angeben, warum es nicht geladen wird. Andere ähnliche wurden ohne Probleme geladen.

Ich versuche nur zu sehen, ob ich die QGIS-Quelle tatsächlich herunterladen und auch damit beginnen muss…? (ich hoffe nicht)

die erste Schicht lädt ohne Probleme. es verweist auf eine postgis-Tabelle. die zweite nicht, aber die other_table ist eine Ansicht. Vielleicht macht das einen Unterschied, aber es gibt keine Fehlermeldungen oder Ausnahmen, die mich wissen lassen, was nicht stimmt…

Nichts Besonderes:

#first vLayer self.uri.setDataSource('public','some_table','location',") self.first_layer = QgsVectorLayer(self.uri.uri(), 'Some Locations', "postgres") QgsMapLayerRegistry.instance( ).addMapLayer( self.first_layer) #second Layer self.uri.setDataSource('public', 'another_table', 'location',") self.second_layer = QgsVectorLayer(self.uri.uri(), 'Ein weiterer Satz von Standorten ', "postgres") QgsMapLayerRegistry.instance().addMapLayer( self.second_layer)

Ich denke, Sie müssen einen Feldnamen angeben, der von QGIS als Primärschlüssel verwendet werden soll:

self.uri.setDataSource('public', 'another_table', 'location',, 'key_field')

Achte natürlich darauf'key_field'in Ihrer Ansicht vorhanden ist und ein eindeutiges Feld ist, oder erstellen Sie ein Feld mit solchen Merkmalen in Ihrer Ansicht.

Wenn dies nicht funktioniert, lesen Sie So debuggen Sie den Fehler "Ebene ist nicht gültig" vom Python-Plugin? und versuchen Sie, die SQL, die Ihre Ansicht definiert, direkt an . weiterzugebensetDataSource, so was:

query = 'SELECT key_field, location,… FROM… WHERE… ' self.uri.setDataSource(", '(' + query + ')', 'location',", 'key_field')

Zu Fuß die Pisten hoch. Schnell gehen oder langsam gehen?

Diese Frage frisst mir schon seit geraumer Zeit den Kopf.

Ich wandere oft und bei den meisten Wanderungen klettere ich auf einen Gipfel oder ähnliches. Normalerweise trage ich schwere Lasten von etwa 13-15 kg auf dem Rücken und ich habe immer festgestellt, dass es mit den schwereren Lasten einfacher ist, die Hänge eines Hügels / Berges in einem flotteren Tempo zu erklimmen. Ich klettere schnell, ruhe mich ein oder zwei Minuten aus und starte zügig wieder. Ich habe jedoch Trekker getroffen, die mir gesagt haben, dass dies keine gute Übung ist und dass es besser ist, ein langsames Tempo beizubehalten, während man die Pisten hochfährt. Ich habe das ein paar Mal versucht, aber ein langsameres Tempo ermüdet mich schneller, während ich schwerere Lasten trage.

Somit, was ist besser, wenn man die Piste hochgeht? Langsameres oder flotteres Tempo? Oder ist es nur eine Frage der Wahl und mehr nicht? (Besser im Hinblick auf die Leichtigkeit des Aufstiegs und die Vermeidung von Verletzungen über einen Zeitraum von Jahren)

Ich würde mich sowohl über persönliche Vorlieben als auch über wissenschaftliche Antworten auf die Frage freuen.

Hinweis: Ich beziehe mich nicht auf Höhenanstiege d.h. mehr als 3000m (in höheren Lagen ist aufgrund der Akklimatisierung nur langsames Tempo ratsam). Außerdem haben die Pisten, auf die ich mich beziehe, Steigungen von 30 - 50 Grad.

Bitte beachte, dass ich mir keine Sorgen um die Beibehaltung der Gruppenstruktur einer Trekkinggruppe oder die Zeit für langsames vs. schnelles Gehen mache. Ich mache mir Sorgen über die möglichen Verletzungen und die Leichtigkeit des Aufstiegs.


Wie kann ich Hunderte von Bildern ausrichten?

Ich habe mehrere Sammlungen von etwa 400 Fotos, die ich mit Intervallaufnahmen gemacht habe. Manchmal bewegt sich die Kamera während der Aufnahme ganz leicht. Mein Ziel ist es, alle Bilder in voller Auflösung auszurichten, damit ich sie zu einem einzigen Bild kombinieren kann. (Das Kombinieren erfolgt in einer Software, die ich selbst geschrieben habe.)

Normalerweise verwende ich die Auto-Align-Funktion von Photoshop zum Ausrichten von Bildern, die hervorragende Ergebnisse liefert, aber bei so vielen Bildern scheint es entweder nicht zu funktionieren oder extrem langsam zu sein. Photoshop reagierte nicht mehr und beanspruchte Tage später immer noch 100% CPU, als ich es beendete. Ich habe versucht, es auf nur perspektivische Transformation (anstatt auf Auto) zu ändern, aber es schien nicht zu helfen.

Nach ein wenig Google-Suche sagen einige Leute, dass Sie das Ausrichten in Photoshop in Stapeln durchführen können. Dies ist jedoch, soweit ich das beurteilen kann, nicht möglich. Wenn ich die ersten zwanzig Bilder getrennt von den nächsten zwanzig ausrichte, werden die beiden Bildersätze nicht aneinander ausgerichtet. Sofern es keine Möglichkeit gibt, die automatische Ausrichtungsfunktion von Photoshop zu beschleunigen, suche ich nach einer Software, die für das Ausrichten dieser vielen Bilder entwickelt wurde.

Eine Option, die ich ausprobiert habe, ist align_image_stack , die Teil von Hugin ist. Dies hatte jedoch eigene Probleme. Bei meinem letzten Versuch dauerte die Ausführung Tage und die Bilder wurden nicht richtig ausgerichtet. Außerdem werden die Dateien in einem unpraktischen Format gespeichert. (Einzelheiten finden Sie im Bearbeitungsverlauf.) Ich vermute, dass sowohl Hugin als auch Photoshop für das Ausrichten von höchstens ein paar Dutzend Bildern optimiert sind und nicht wirklich für große Stapel ausgelegt sind.

Dies sind RAW-Dateien direkt aus meiner Pentax K50 und sie sind jeweils etwa 14-15 MB groß, also sind es viele Daten, wenn man sie alle zusammenfügt - sie passen nicht alle in den Speicher, und ich suche nach einem Tool, das in diesem Sinne entwickelt wurde.


3 Antworten 3

Ohne Zweifel würde ich Auslöser ausschließen und strikt bei Transaktionen bleiben.

Trigger sind von Natur aus gespeicherte Prozeduren. Ihre Aktionen sind praktisch schwer rückgängig zu machen. Selbst wenn alle zugrunde liegenden Tabellen InnoDB sind, werden Sie eine proportionale Menge an gemeinsamen Zeilensperren und lästige Unterbrechungen durch exklusive Zeilensperren erleben. Dies wäre der Fall, wenn Trigger Tabellen mit manipulieren würden INSERTs und UPDATEs werden stagniert, um in jedem Aufruf eines Triggers ein hochleistungsfähiges MVCC durchzuführen.

Kombinieren Sie dies mit der Tatsache, dass in MySQLs Stored Procedure Language keine geeigneten Datenvalidierungsprotokolle implementiert sind. Business Intelligence kann in einer Datenbank enthalten sein, vorausgesetzt, die Stored Procedure Language kann mit einer Transaktionsumgebung umgehen. Als MySQL DBA muss ich ehrlich sagen, dass dies bei MySQL nicht der Fall ist. Oracle (PL/SQL), PostgreSQL (PL/pgSQL) und SQL Server (T-SQL) haben diesen Vorteil gegenüber MySQL.

In Bezug auf Transaktionen verwendet MySQL InnoDB als seine wichtigste ACID-konforme Speicher-Engine (Standard-Speicher-Engine in MySQL 5.5). Es verfügt über eine hervorragende Absturzwiederherstellung und befolgt die ACID-Konformitätsprotokolle.

Ich würde jedes Mal Transaktionen den Triggern vorziehen.

Ich stimme Rolandos Einschätzung zu. Ihre Geschäftslogik sollte sich in Ihrer Anwendung befinden und Änderungen an der Datenbank transaktional vornehmen.

Die Skalierung auf 100.000 Benutzer hängt natürlich von Ihrer Anwendung und dem generierten Datenbankverkehr ab. Wenn MySQL unter einer hohen transaktionalen Schreiblast steht, werden Sie möglicherweise bald mit der Last des Shardings und/oder der Replikation Ihres Datasets konfrontiert, um eine akzeptable Anwendungsantwort aufrechtzuerhalten.

Es gibt jedoch Alternativen zum Sharding von MySQL. Einer von ihnen ist Cluster (mein Arbeitgeber), bei dem es sich um ein parallel skalierbares Hochleistungs-Einzelinstanz-SQL-Datenbanksystem handelt. Es ist ein geclustertes Datenbanksystem, das sich als einzelner MySQL-Server präsentiert. Die nahtlose Skalierung der in diesem Thread beschriebenen Datenbank auf 100.000 Benutzer auf einer einzigen Instanz von Clustrix würde kein Sharding und keine zusätzliche Anwendungslogik erfordern.

Darüber hinaus sollten Trigger nicht für Logik verwendet werden, da die Dinge nach ein paar miteinander verbundenen Triggern später schnell verwirrend werden. Ein netter Satz von Anweisungen in einer gespeicherten Prozedur oder einer clientseitigen Prozedur kann die Geschäftslogik klarer vermitteln als ein Haufen versteckter Logik in der Datenbank. Es gibt auch Einschränkungen bei Triggern in Bezug auf die Tabelle, von der sie ausgelöst werden – so dass Sie Ihre Logik möglicherweise an zwei verschiedenen Stellen aufteilen.

Darüber hinaus finden Sie möglicherweise Möglichkeiten, den Zeitpunkt zu optimieren, an dem diese Berechnungen in Ihrem Geschäftslogikserver ausgeführt werden, während ein Trigger jedes Mal ausgelöst wird. Sie werden feststellen, dass Sie den Trigger ausschalten, die Tabelle aktualisieren und dann den Trigger wieder aktivieren – was auch bedeutet, dass Sie die Triggerlogik einfügen müssen das Code.

Darüber hinaus – Sie müssen nicht die gesamte Logik im Geschäftslogikteil des Codes haben – möchten Sie möglicherweise die Tabellenintegrität mithilfe von gespeicherten Prozeduren erzwingen. Dies kann eine Transaktion starten, Ihre mehreren Aktualisierungen durchführen und die Dinge gut zurücksetzen, wenn etwas fehlschlägt. So kann beispielsweise ein Blick in die Datenbank die Logik zum Einfügen einer Bestellung erkennen. Dies ist in der heutigen Welt weniger wichtig, da Webdienste die einzige Zugriffsschnittstelle auf die DB sein können, aber in dem Fall, in dem mehrere ausführbare Dateien Zugriff auf die DB haben, kann dies enorm sein.

Außerdem – Sie werden sowieso Transaktionen haben – werden Sie Ihre Trigger nicht ohne einen ausführen. Rechts? Es ist also gut zu wissen, wie man eine Transaktion startet, einige Dinge tut und dann eine Transaktion beendet. Wenn Sie dieses Muster in Ihrem Code sehen, wird ein weiterer Codeabschnitt, der es verwendet, die kognitive Belastung gering halten. Ein Trigger zwingt Sie, wenn Sie sich daran erinnern, dass er vorhanden ist, für die Transaktionen, die vom Trigger betroffen sind, anders zu denken, insbesondere wenn andere Tabellen gezogen werden, die ebenfalls Trigger haben können.

Grundsätzlich können Sie zwischen einem regelmäßig geplanten Cron-Job (oder Datenbank-Agent-Job) und guten gespeicherten Prozeduren 99% der gewünschten Ergebnisse erzielen. Die 1% überdenken das Projekt.


7 Antworten 7

Die wahrscheinlichste Quelle für diese Informationen ist die WebRTC-Implementierung Ihres Browsers.

Sie können dies im Quellcode von ip-api.com sehen.

Von https://github.com/diafygi/webrtc-ips, das auch eine Demo dieser Technik bietet:

Firefox und Chrome haben WebRTC implementiert, mit dem Anfragen an STUN-Server gestellt werden können, die die zurückgeben lokale und öffentliche IP-Adressen für den Benutzer. Diese Anforderungsergebnisse stehen für Javascript zur Verfügung, sodass Sie jetzt lokale und öffentliche IP-Adressen eines Benutzers in Javascript abrufen können.

Kürzlich wurde festgestellt, dass die New York Times diese Technik verwendet, um zwischen echten Besuchern und Bots zu unterscheiden (d. h. wenn die WebRTC-API verfügbar ist und gültige Informationen zurückgibt, handelt es sich wahrscheinlich um einen echten Browser).

Es gibt einige Chrome-Erweiterungen, die vorgeben, diese API zu blockieren, aber sie scheinen im Moment nicht effektiv zu sein. Möglicherweise liegt das daran, dass es im Browser noch nicht die Hooks gibt, auf die die GitHub-README anspielt:

Darüber hinaus werden diese STUN-Anfragen außerhalb des normalen XMLHttpRequest-Verfahrens gestellt, sodass sie in der Entwicklerkonsole nicht sichtbar sind oder von Plugins wie AdBlockPlus oder Ghostery blockiert werden können.

Eine gängige Methode zum Abrufen der internen IP-Adresse ist die Verwendung von RTCPeerConnection in JavaScript.

http://ip-api.com/ ruft beispielsweise eine Javascript-Funktion namens "gi" auf, die den folgenden Code enthält:

Technisch geschieht dies, indem ein Callback auf der RTC Connection (Objekt o) mit "onicecandidate" gesetzt wird und das Attribut Candidate.candidate aus dem Event geholt wird. Dadurch werden alle lokalen IP-Adressen Ihrer Netzwerkschnittstellen aufgelistet.

Das JavaScript-Skript kann diese Informationen an einen Internetserver zurücksenden, aber http://ip-api.com/ beispielsweise zeigt sie dem Client nur an.

WebRTC ist nur eine von mehreren Möglichkeiten, LAN-IP-Adressen zu ermitteln.

Zu diesem Thema gab es einen netten Vortrag von Black Hat 2012 mit dem Titel Blended Threats and JavaScript: A Plan For Permanent Network Compromise, in dem Phil Purviance und Josh Brashars eine automatisierte Methode vorstellten, um Ihren Heim-WLAN-Router mit einem einzigen Klick auf a zu finden und zu löschen Webseite.

Dies war älter als WebRTC, sodass sie die IP-Adresse Ihres Routers auf andere Weise ermitteln mussten. Dies kann mit JavaScript-Scannern wie jslanscanner, JSScan, JS-Recon geschehen, aber einer einfachen (aber großen) Sammlung von eingebetteten Objekten, die lediglich die Adresse des Routers erraten (z. B. durch Einbetten eines erwarteten Router-Images und Notieren, wenn es erfolgreich geladen wird). Sobald Sie die Adresse haben, können Sie das Passwort (beginnend mit dem erwarteten Standard) mit RouterPasswords.com erraten oder sogar die Authentifizierung über Routerpwn.com umgehen.

Als Proof of Concept entdeckte ihre Demonstration die Router-IP, suchte nach seinem Standardpasswort, loggte sich ein und installierte automatisch Ersatz-Firmware (DD-WRT). Ein echter Angriff könnte eine beliebige Anzahl bösartiger Fähigkeiten auf die neue Firmware haben und sie leicht als das unveränderte ursprüngliche Router-System erscheinen lassen.

(Zugegeben, dies identifiziert die LAN-IP-Adresse Ihres Heim-WLAN-Routers und nicht Ihre lokale LAN-IP-Adresse, aber es ist ziemlich nahe und wohl alarmierender.)


7 Antworten 7

Sie müssen damit rechnen, dass Ihr Programm aus mehr Gründen als nur einer unbehandelten Ausnahme, wie einem Stromausfall oder einem anderen Hintergrundprozess, der das gesamte System zum Absturz bringt, beendet wird. Daher würde ich empfehlen, die Anwendung zu beenden und neu zu starten, jedoch mit einigen Maßnahmen, um die Folgen eines solchen Neustarts abmildern und Minimieren Sie den möglichen Datenverlust.

Beginnen Sie mit der Analyse der folgenden Punkte:

Wie viele Daten können bei einem Programmabbruch tatsächlich verloren gehen?

Wie schwer ist ein solcher Verlust wirklich für den Benutzer? Können die verlorenen Daten in weniger als 5 Minuten rekonstruiert werden, oder reden wir davon, einen Tag Arbeit zu verlieren?

Wie viel Aufwand ist es, eine „Zwischensicherung“-Strategie zu implementieren? Schließe das nicht aus, denn "der Benutzer müsste einen Änderungsgrund eingeben" bei einem regulären Speichervorgang, wie Sie in einem Kommentar geschrieben haben. Stellen Sie sich besser so etwas wie eine temporäre Datei oder einen temporären Zustand vor, die nach einem Programmabsturz automatisch neu geladen werden können. Viele Arten von Produktivitätssoftware tun dies (zum Beispiel MS Office und LibreOffice haben beide eine "Autosave"-Funktion und eine Wiederherstellung nach einem Absturz).

Kann der Benutzer dies leicht erkennen, falls Daten falsch oder beschädigt waren (vielleicht nach einem Neustart des Programms)? Wenn ja, können Sie dem Benutzer die Möglichkeit geben, die Daten zu speichern (mit einer kleinen Chance, dass sie beschädigt sind), dann einen Neustart erzwingen, neu laden und den Benutzer überprüfen lassen, ob die Daten in Ordnung sind. Stellen Sie sicher, dass Sie nicht die letzte regelmäßig gespeicherte Version überschreiben (stattdessen in einen temporären Speicherort/eine Datei schreiben), um eine Beschädigung der alten Version zu vermeiden.

Ob eine solche „Zwischensicherung“-Strategie sinnvoll ist, hängt letztlich von der Anwendung und deren Architektur sowie von der Art und Struktur der betroffenen Daten ab. Aber wenn der Benutzer weniger als 10 Minuten Arbeit verliert und ein solcher Absturz einmal pro Woche oder noch seltener passiert, würde ich mir wahrscheinlich nicht allzu viele Gedanken machen.

Dies hängt in gewissem Maße von der Anwendung ab, die Sie entwickeln, aber im Allgemeinen würde ich sagen, dass Sie Ihre Anwendung beenden müssen, wenn eine nicht behandelte Ausnahme auftritt.

Denn Sie können dem Stand der Bewerbung nicht mehr vertrauen.

Geben Sie auf jeden Fall eine hilfreich Nachricht an den Benutzer, aber Sie sollten die Anwendung letztendlich beenden.

Angesichts Ihres Kontexts würde ich definitiv wollen, dass die Anwendung beendet wird. Sie möchten nicht, dass Software, die in einem Labor ausgeführt wird, eine beschädigte Ausgabe erzeugt, und da Sie nicht daran gedacht haben, die Ausnahme zu behandeln, haben Sie keine Ahnung, warum sie ausgelöst wurde und was passiert.

In Anbetracht dessen, dass dies für ein chemisches Labor gedacht ist und Ihre Anwendung die Geräte nicht direkt steuert, sondern durch andere Dienste:

Beendigung erzwingen, nachdem die Nachricht angezeigt wurde. Nach einer unbehandelten Ausnahme befindet sich Ihre Anwendung in einem unbekannten Zustand. Es könnte fehlerhafte Befehle senden. Es kann sogar Nasendämonen beschwören. Ein Ein fehlerhafter Befehl könnte möglicherweise teure Reagenzien verschwenden oder Geräte oder Personen gefährden.

Aber Sie können noch etwas tun: nach dem Neustart anmutig erholen. Ich gehe davon aus, dass Ihre Anwendung diese Hintergrunddienste bei einem Absturz nicht mit sich selbst herunterfährt. In diesem Fall können Sie den Zustand leicht wiederherstellen. Wenn Sie mehr Status haben, sollten Sie ihn speichern. In einem Speicher, der Vorkehrungen für Datenatomarität und -integrität hat (SQLite vielleicht?).

Wie in den Kommentaren erwähnt, kann der von Ihnen gesteuerte Prozess schnell genug Änderungen erfordern, sodass der Benutzer keine Zeit zum Reagieren hat. In diesem Fall sollten Sie zusätzlich zur ordnungsgemäßen Zustandswiederherstellung einen stillen Neustart der App in Betracht ziehen.

Der Versuch, diese Frage auf der obersten Ebene des Programms allgemein zu beantworten, ist kein kluges Spiel.

Wenn etwas aufgesprudelt ist und zu keinem Zeitpunkt in der Architektur der Anwendung dieser Fall von jemandem in Betracht gezogen wurde, können Sie keine Verallgemeinerungen darüber anstellen, welche Aktionen sicher sind oder nicht.

Nein, es ist definitiv kein allgemein akzeptables Design, dem Benutzer die Wahl zu lassen, ob die Anwendung eine Wiederherstellung versucht oder nicht, da die Anwendung und die Entwickler demonstrativ nicht die erforderliche Sorgfalt walten lassen, um herauszufinden, ob dies möglich oder sogar sinnvoll ist .

Wenn die Anwendung jedoch hochwertige Teile ihrer Logik oder ihres Verhaltens enthält, die im Hinblick auf diese Art der Fehlerwiederherstellung entwickelt wurden und es in diesem Fall möglich ist, sie zu nutzen, dann tun Sie dies auf jeden Fall - In diesem Fall , kann es akzeptabel sein, den Benutzer aufzufordern, zu sehen, ob er eine Wiederherstellung versuchen möchte oder ob er es einfach beenden und von vorne beginnen möchte.

Diese Art der Wiederherstellung ist im Allgemeinen nicht für alle (oder sogar die meisten) Programme erforderlich oder ratsam, aber wenn Sie an einem Programm arbeiten, für das dieser Grad an Betriebsintegrität erforderlich ist, kann dies ein Umstand sein, in dem diese Art von Wiederherstellung Aufforderung an einen Benutzer wäre eine vernünftige Sache.

Anstelle einer speziellen Fehlerwiederherstellungslogik - Nein, tun Sie dies nicht. Sie haben buchstäblich keine Ahnung, was passieren wird, wenn Sie es täten, hätten Sie die Ausnahme weiter unten abgefangen und behandelt.

Das Problem bei "außergewöhnlichen Ausnahmen", also Ausnahmen, die Sie nicht vorhergesehen haben, ist, dass Sie nicht wissen, in welchem ​​​​Zustand sich das Programm befindet. Beispielsweise könnte der Versuch, die Daten des Benutzers zu speichern, tatsächlich noch mehr Daten zerstören.

Aus diesem Grund sollten Sie die Anwendung beenden.

Es gibt eine sehr interessante Idee namens Nur-Absturz-Software von George Candea und Armando Fox. Die Idee ist, dass, wenn Sie Ihre Software so entwickeln, dass die einzige Möglichkeit zum Beenden darin besteht, sie zum Absturz zu bringen und die einzige Möglichkeit zum Starten darin besteht, sich nach einem Absturz zu erholen, dann wird Ihre Software widerstandsfähiger und die Fehlerbehebung Codepfade werden viel gründlicher getestet und geübt.

Sie kamen auf diese Idee, nachdem sie bemerkten, dass einige Systeme gestartet wurden Schneller nach einem Crash als nach einem geordneten Shutdown.

Ein gutes, wenn auch nicht mehr relevantes Beispiel sind einige ältere Firefox-Versionen, die nicht nur bei der Wiederherstellung nach einem Absturz schneller starten, sondern auch auf diese Weise eine bessere Startup-Erfahrung haben! Wenn Sie Firefox in diesen Versionen normal herunterfahren, schließt es alle geöffneten Tabs und startet mit einem einzigen leeren Tab. Während bei der Wiederherstellung nach einem Absturz die geöffneten Registerkarten zum Zeitpunkt des Absturzes wiederhergestellt werden. (Und das war die einzige Möglichkeit, Firefox zu schließen, ohne den aktuellen Browserkontext zu verlieren.) Also, was haben die Leute gemacht? Sie haben Firefox einfach nie geschlossen und stattdessen immer mit pkill -KILL Firefox bearbeitet.

In den Linux Weekly News gibt es einen netten Bericht über Nur-Absturz-Software von Valerie Aurora. Auch die Kommentare sind lesenswert. Zum Beispiel weist jemand in den Kommentaren zu Recht darauf hin, dass diese Ideen nicht neu sind und tatsächlich mehr oder weniger den Designprinzipien von Erlang/OTP-basierten Anwendungen entsprechen. Und natürlich, wenn wir uns das heute ansehen, weitere 10 Jahre nach Valeries und 15 Jahre nach dem ursprünglichen Artikel, könnten wir feststellen, dass der aktuelle Micro-Service-Hype diese Ideen noch einmal neu erfindet. Das moderne Rechenzentrumsdesign auf Cloud-Ebene ist auch ein Beispiel für eine gröbere Granularität. (Jeder Computer kann jederzeit abstürzen, ohne das System zu beeinträchtigen.)

Es reicht jedoch nicht aus, Ihre Software einfach abstürzen zu lassen. Es muss dafür ausgelegt sein. Idealerweise würde Ihre Software in kleine, unabhängige Komponenten zerlegt, von denen jede unabhängig voneinander abstürzen kann. Außerdem sollte sich der "Absturzmechanismus" außerhalb der Komponente befinden, die abgestürzt wird.


Mir ist klar, dass diese Frage beantwortet wurde, aber ich glaube nicht, dass die vorhandene Antwort die Frage wirklich beschäftigt, außer auf einen Link zu verweisen, der sich im Allgemeinen auf das Thema der Frage bezieht. Insbesondere beschreibt der Link eine Technik für die programmatische Netzwerkkonfiguration, aber das ist kein "[a] Standard- und anerkannte Methode" für die Netzwerkkonfiguration.

Durch Befolgen eines kleinen Satzes klarer Regeln kann man programmgesteuert eine kompetente Netzwerkarchitektur festlegen (d. h. die Anzahl und Art der neuronalen Schichten und die Anzahl der Neuronen, die jede Schicht umfasst). Nach diesem Schema erhalten Sie eine kompetente Architektur, aber wahrscheinlich keine optimale.

Aber sobald dieses Netzwerk initialisiert ist, können Sie die Konfiguration während des Trainings mit einer Reihe von Hilfsalgorithmen iterativ abstimmen Beschneidung Knoten basierend auf (kleinen) Werten des Gewichtsvektors nach einer bestimmten Anzahl von Trainingsepochen – mit anderen Worten, Eliminieren unnötiger/redundanter Knoten (mehr dazu weiter unten).

Jedes NN hat also drei Arten von Schichten: Eingang, versteckt, und Ausgang.

Das Erstellen der NN-Architektur bedeutet daher, Werte für die Anzahl der Schichten jedes Typs und die Anzahl der Knoten in jeder dieser Schichten zu erstellen.

Die Eingabeschicht

Ganz einfach – jedes NN hat genau eine davon – keine Ausnahmen, die mir bekannt sind.

In Bezug auf die Anzahl der Neuronen, aus denen diese Schicht besteht, ist dieser Parameter vollständig und eindeutig bestimmt, sobald Sie die Form Ihrer Trainingsdaten kennen. Speziell, Die Anzahl der Neuronen, aus denen diese Schicht besteht, entspricht der Anzahl der Features (Spalten) in Ihren Daten. Einige NN-Konfigurationen fügen einen zusätzlichen Knoten für einen Bias-Term hinzu.

Die Ausgabeschicht

Wie die Eingabeschicht hat jedes NN genau einer Ausgabeschicht. Die Bestimmung seiner Größe (Anzahl der Neuronen) ist einfach und wird vollständig durch die gewählte Modellkonfiguration bestimmt.

Läuft deine NN ein? Maschine Modus oder Rückschritt Modus (die ML-Konvention, einen Begriff zu verwenden, der auch in der Statistik verwendet wird, ihm jedoch eine andere Bedeutung zuweist, ist sehr verwirrend). Maschinenmodus: Gibt ein Klassenlabel zurück (z. B. "Premium Account"/"Basic Account"). Der Regressionsmodus gibt einen Wert (z. B. Preis) zurück.

Wenn das NN ein Regressor ist, hat die Ausgabeschicht einen einzelnen Knoten.

Wenn das NN ein Klassifikator ist, hat es auch einen einzelnen Knoten, es sei denn softmax wird verwendet. In diesem Fall hat die Ausgabeschicht einen Knoten pro Klassenlabel in Ihrem Modell.

Die versteckten Schichten

Diese wenigen Regeln legen also die Anzahl der Schichten und die Größe (Neuronen/Schicht) sowohl für die Eingabe- als auch für die Ausgabeschicht fest. Das lässt die versteckten Schichten.

Wie viele versteckte Schichten? Nun, wenn Ihre Daten linear trennbar sind (was Sie oft wissen, wenn Sie mit der Codierung eines NN beginnen), dann brauchen Sie überhaupt keine versteckten Schichten. Natürlich brauchen Sie auch keine NN, um Ihre Daten aufzulösen, aber es wird trotzdem funktionieren.

Darüber hinaus gibt es, wie Sie wahrscheinlich wissen, einen Berg von Kommentaren zur Frage der Hidden-Layer-Konfiguration in NNs (eine hervorragende Zusammenfassung dieses Kommentars finden Sie in den wahnsinnig gründlichen und aufschlussreichen NN-FAQ). Ein Konsens innerhalb dieses Themas ist der Leistungsunterschied durch das Hinzufügen zusätzlicher verdeckter Schichten: Es gibt nur sehr wenige Situationen, in denen die Leistung mit einer zweiten (oder dritten usw.) verdeckten Schicht verbessert wird. Eine versteckte Schicht ist für die meisten Probleme ausreichend.

Wie sieht es also mit der Größe der verborgenen Schicht(en) aus – wie viele Neuronen? Es gibt einige empirisch abgeleitete Faustregeln, von denen man sich am häufigsten auf diedie optimale Größe des versteckten Layers liegt normalerweise zwischen der Größe der Eingabe- und der Größe der Ausgabe-Layer'. Jeff Heaton, Autor von Introduction to Neural Networks in Java, bietet noch einige mehr.

Zusammenfassend lässt sich sagen, dass man für die meisten Probleme wahrscheinlich eine anständige Leistung (auch ohne einen zweiten Optimierungsschritt) erzielen kann, indem man die Konfiguration der versteckten Schicht mit nur zwei Regeln festlegt: (i) Anzahl der versteckten Schichten ist gleich eins und (ii) die Anzahl der Neuronen in diese Schicht ist der Mittelwert der Neuronen in der Eingabe- und Ausgabeschicht.

Optimierung der Netzwerkkonfiguration

Beschneidung beschreibt eine Reihe von Techniken zum Trimmen der Netzwerkgröße (durch Knoten, nicht durch Schichten), um die Rechenleistung und manchmal die Auflösungsleistung zu verbessern. Der Kern dieser Techniken besteht darin, Knoten während des Trainings aus dem Netzwerk zu entfernen, indem diejenigen Knoten identifiziert werden, die, wenn sie aus dem Netzwerk entfernt würden, die Netzwerkleistung (d. h. die Auflösung der Daten) nicht merklich beeinträchtigen würden. (Auch ohne eine formale Beschneidungstechnik zu verwenden, können Sie sich eine grobe Vorstellung davon machen, welche Knoten nicht wichtig sind, indem Sie sich Ihre Gewichtsmatrix nach dem Training ansehen beim Bereinigen.) Wenn Sie während des Trainings einen Bereinigungsalgorithmus verwenden, beginnen Sie natürlich mit einer Netzwerkkonfiguration, bei der es wahrscheinlicher ist, dass sie überzählige (dh 'beschneidungsfähige') Knoten hat - mit anderen Worten, wenn Sie sich für eine Netzwerkarchitektur entscheiden, gehen Sie weiter die Seite von mehr Neuronen, wenn Sie einen Beschneidungsschritt hinzufügen.

Anders ausgedrückt, indem Sie während des Trainings einen Beschneidungsalgorithmus auf Ihr Netzwerk anwenden, können Sie sich der optimalen Netzwerkkonfiguration nähern, ob Sie dies in einem einzigen "Vorab" tun können (z , obwohl ich weiß, dass diese zweistufige Optimierung im Moment häufiger vorkommt.


Quickie: WMV-Bildschirmaufnahmen und animierte GIFs

Gelegentlich mache ich Screenshots. Â Ich verwende den Microsoft Expression Encoder. Es ist nicht schön, aber ich denke, es ist kostenlos. Â Die Ausgabe ist standardmäßig eine WMV-Datei (Windows Media Video).

YouTube ist mit WMV-Dateien völlig in Ordnung. Â Damit eine Animation in Twitter angezeigt wird, muss es sich jedoch um ein animiertes GIF mit einer Beschränkung von 5 MB handeln.

Dies dauerte ein 14-20 MB animiertes GIF (unkomprimiert) auf 1,36 MB. Â Was schön ist, denn dann kann ich Edelsteine ​​wie diese zeigen:

Etwas sagt mir, dass dies nicht der richtige Weg ist, um zu funktionieren. pic.twitter.com/dxtf6HGbpP

&mdash Andrew Rohe (@okiAndrew) 11. August 2016


5 Antworten 5

Berühren Sie nicht Linux. Ich hasse es, wie Leute direkt in "Go with Linux" springen, sobald Sie Probleme mit einem Windows-Rechner haben. An Linux ist nichts auszusetzen, aber es zu lernen, indem man es als Ersatz für einen Produktions-Mailserver installiert, ist nicht der richtige Weg, um es zu lernen.

Wenn Sie mit Linux nicht 100% vertraut sind, wird es nur ein größerer Schmerz sein, als es wert ist, und Ihre Benutzer müssen die Groupware von Exchange aufgeben. Da Sie gemeinnützig sind, vermute ich, dass Ihre Benutzer sehr technikfremd sind und es für sie besser ist, bei Exchange/Outlook zu bleiben, wie Sie selbst gesagt haben. Sie werden Google Mail auch nicht so mögen, wie ich vermute, da die kostenlose Version (zumindest das, was ich für ein benutzerdefiniertes Domainkonto verwendet habe) Werbung enthält und Sie dann alle E-Mails dorthin verschieben müssen. Da Sie bereits Exchange und alle Lizenzen haben, würde ich dabei bleiben und Ihre Hardware einfach neu aufstellen. Sie und Ihre Benutzer werden glücklicher sein.

In Bezug auf die Spezifikationen werden 11 Benutzer (und die vorherigen 30) keine Probleme mit diesen haben. Als Referenz habe ich einen 100-Benutzer-Exchange-Server mit 40 gleichzeitig aktiven Benutzern auf einem älteren AMD-Desktop mit 512 MB RAM und einem IDE-Laufwerk betrieben. Dies war ein temporärer Server, während ich den Produktionsserver umgebaut habe. Niemand achtete auf Geschwindigkeit, lief 4 Wochen lang großartig, bis ich es zurück auf den echten Server verlegte.

Starten Sie die OptiPlex Workstation, richten Sie Windows und Exchange darauf ein.

Verschieben Sie alle Postfächer dorthin, stellen Sie sicher, dass alle Benutzer aktiv sind und auf den neuen Server verweisen (wenn Sie beide online lassen, geschieht dies automatisch beim Anmelden)

Sobald dies erledigt ist, deinstallieren Sie Exchange von PowerEdge. Durch die Deinstallation wird es sauber aus der Exchange-Organisation entfernt

Entfernen Sie den PowerEdge aus der Domäne.

Formatieren Sie den PowerEdge neu, machen Sie das SCSI-Laufwerk zu einem großen C:

Verbinden Sie es mit der Domäne, installieren Sie Exchange darauf neu.

Verschieben Sie die Postfächer zurück auf den PowerEdge-Server.

Deinstallieren Sie Exchange vom OptiPlex, alle sind auf dem neuen PowerEdge

Entfernen Sie den OptiPlex aus der Domäne

Wenn die Postfächer zu diesem Zeitpunkt klein genug sind, können Sie es so belassen. Aber wenn Sie können, könnte dies Ihre nächsten Schritte sein.

Setzen Sie die 80-Gig-IDE in den PowerEdge (ich kann mich nicht erinnern, ob die 1400er eine Onboard-IDE haben oder nicht, wenn sie dies tun, ist dies einfach)

Formatieren Sie das neue 80-Gig-Laufwerk, und verschieben Sie dann den Postfachspeicher auf das 80-Gig-Laufwerk.

Sobald Sie fertig sind, haben Sie jetzt ein 20-Gig-Systemlaufwerk und ein 80-Gig-Datenlaufwerk.

Richten Sie eine automatische Sicherung des Postfachspeichers auf einem anderen Computer ein, falls Ihr Datenlaufwerk ausfällt.

Angesichts des begrenzten Geldes und der Ausrüstung, das Sie haben, ist dies möglicherweise der beste Weg.

Wenn Sie überhaupt $ haben, fügen Sie dem 1400 eine RAID 1-Karte hinzu und fügen Sie 2x 250-Gig-Laufwerke anstelle des alten SCSI hinzu, dies wäre Schritt 4 des ersten Teils. Der Rest der 1400 hält ewig, die Festplatten sind die Schwachstellen. Die Geschwindigkeit und der Speicher des 1400 sind in der Lage, alles zu verarbeiten, was Sie brauchen. Ich habe einen 10 Jahre alten HP-Server, der immer noch wie ein Champion funktioniert, ich habe ein paar neue Festplatten hineingelegt und er läuft immer noch stark. Auch dies war an einem gemeinnützigen Ort, so dass ich mich mit dem begrenzten Budget identifizieren kann.

Betrachten Sie die Gesamtbetriebskosten, wenn Sie überlegen, was zu tun ist. Hier ist ein grundlegendes Beispiel für Annahmen für Zahlen.

Wenn Sie sich 12 Stunden Zeit nehmen, um die gesamte Fehlerbehebung mit Windows durchzuführen, beispielsweise 20 USD pro Stunde, das sind 240 USD, wird dies Ihre Wohltätigkeitsorganisation kosten. Auch wenn Sie ein Angestellter sind, müssen Sie Ihre Zeit als Kosten anrechnen.

Wenn Sie nun zu Linux wechseln (ein Betriebssystem, das Sie nicht kennen, also fügen Sie die Lernkurve hinzu), müssen Sie sich auch das ansehen. Nehmen wir also an, Sie sind gut und es wird 24 Stunden dauern, bis alles auf eine Linux-Box verschoben und vollständig online ist (denken Sie daran, auch alle Postfächer zu ExMerge). Das sind zu diesem Zeitpunkt etwa 480 US-Dollar. Fügen Sie jedoch auch alle Benutzerschulungen für den neuen Webclient hinzu, den Sie verwenden werden, sowie das IMAP-Setup in Outlook für sie. Es wird wahrscheinlich mehr sein, sagen wir, eine weitere Stunde pro Person x 10 Personen @ 15 US-Dollar pro Stunde sind weitere 150 US-Dollar, die Sie einkalkulieren müssen. Fügen Sie außerdem mehr Zeit pro Woche für Ihren täglichen Betrieb hinzu, da Sie es immer noch tun werden sich damit wohlfühlen. Die ganze Zeit, die Sie dafür aufwenden, ist Zeit, die Sie nicht auf Ihre anderen Jobs bei der Wohltätigkeitsorganisation verwenden, daher ist dies ein Preis.

Wenn Sie von MS Wohltätigkeitspreise erhalten und sagen, dass die Lizenzkosten + Ihre Zeit geringer sind als die Kosten für das Erlernen von Linux, dann ist es sinnvoller, eine neue Lizenz für Windows 2008 zu kaufen (Sie können jedoch Windows 2003 verwenden, das weiterhin läuft diese Hardware).

Rufen Sie also am Ende des Tages CDW an und holen Sie sich die Charity-Preise für die Open Licence, dann haben Sie bis Juli 2010 Zeit, die Wohltätigkeitsorganisation genug Geld zu sparen, um das zu kaufen, und auf lange Sicht werden Sie das viel billiger finden dann mit Linux. Ich habe die Bewertung schon einmal gemacht, Windows Charity + Meine Zeit ist immer billiger als Linux + Learning Curve + Risk.

Ich kenne Linux nicht genug (ich wünschte, ich hätte es), wenn ich es also auf einem Server bekomme und es später abstürzt, würde ich einen Linux-Guru mit viel mehr pro Stunde anrufen, als ich verdiene, und die Wohltätigkeitsorganisation würde es ernst nehmen Treffer (unbekanntes Risiko). Ich habe noch kein Windows-Problem, das ich nicht behoben habe, oder im schlimmsten Fall 260 $. Ich kann ein Ticket bei MS eröffnen (bekanntes Risiko).

Und wenn Sie Zeit haben, lernen Sie Linux, starten Sie es in einer unkritischen Rolle, damit Sie, wenn es bei Ihnen abstürzt, kein Geld für jemanden ausgeben müssen, um es wieder in Gang zu bringen. Ich betreibe einen Linux-Server, der ein Backup-Dateiserver ist, nicht der primäre, den die Benutzer verwenden. Wenn es also ausfällt, ist die primäre immer noch online und ich kann die Zeit damit verbringen, es herauszufinden. Sobald ich damit vertraut bin, werde ich es wahrscheinlich auf den Produktionsdateiserver verschieben, damit ich diese Windows-Lizenz für etwas anderes freigeben kann. But until I'm comfortable with it, I can't risk it going down and me not knowing my way around the server. If the IT is a secondary role for you it will be hard for you to spend enough time with Linux on company time, unless you spend time on your learning it. Never a bad idea, but I've been there and I don't like losing that much of my home life to the computer.


There is no other way but EIN (not so fast boy)

After extensive consultations with our space hab design engineer @John and him investigating papers on motion sickness (comment section for links and refs) it became apparent that even if B case may have some advantages from a structural perspective(so as problems), it has some disadvantages for human content of the space habitat. As a vector of apparent gravity will oscillate around a vertical axis, and it causing some unwanted consequences, like motion sickness, because the threshold is quite low,

So people have to adapt, but it is not known which other consequences it may have to humans living 24.7.365 in such conditions. Have seen an infant living on a yacht in Atlantics, just recently on yt, seems doing fine enough, so as there are some historical tribes which live on floating means, so as there are people living half-year at sea, but still, it is a problem which has to be considered, especially on the scale millions or more of different people living in such conditions. 33% of children below age 12, are more sensitive to the problem, for lesser ages it can be as high as half of them. people adapt, but yeah the problem has to be investigated specifically before the B case is rated for humans.

  • Good news for treemans - they do not have to have wind for their branches to grow healthy and strong, maybe.

So B case has problems as well.