Code, der nur einmal ausgeführt wird

223

Tor

Ziel dieser Herausforderung ist es, Code zu schreiben, der nur einmal ausgeführt wird. Dies bedeutet im Grunde, dass es das Programm, das Skript oder die Umgebung in irgendeiner Weise beschädigt. Beim Neustart des Systems kann der Code erneut ausgeführt werden, was zulässig ist.

Wertung

Anzahl der Stimmen. Alle Annahmen müssen klar aufgelistet sein. Alle Antworten, die nur einen Neustart oder einen Stopp auslösen, werden disqualifiziert.

Zusätzliche Regeln, weil Greg Hewgill ein Halbgott ist

Es ist kein Root-Zugriff erlaubt.

Endtermin

Der Wettbewerb endet am 31. Mai 2014.

Bearbeiten

Dieser Wettbewerb wurde in einen Beliebtheitswettbewerb geändert.

Ojblass
quelle
7
@PeterTaylor eine mögliche Lösung wäre das selbst löschen, aber wie das Ergebnis zeigt, ist es nicht die einzige.
Lukei
101
Viele Leute, die viin einer einzigen Terminalumgebung anrufen, haben diesen Effekt, es sei denn, Sie starten neu :) Nur ein Scherz hier.
Orion
6
Es steht Ihnen frei, eine solche Frage vorzuschlagen.
Ojblass
16
echo "If you try to execute me again, it means you are an idiot.";<- Niemand wird mehr als einmal ausgeführt: P
user3459110
25
Hätte sich raketenbezogene Software qualifiziert? ;)
Rsegal

Antworten:

518

Mahnwache

Endlich ein Usecase für Vigil!

def main():
  raise Exception()

Auszug aus der "Sprachspezifikation":

Es versteht sich von selbst, dass jede Funktion, die eine Ausnahme auslöst, die nicht abgefangen wird, falsch ist und bestraft werden muss.

...

Wenn ein Eid gebrochen wird, wird die beleidigende [...] Funktion ordnungsgemäß bestraft.

Wie?

Ganz einfach: Es wird aus Ihrem Quellcode gelöscht.

Die einzige Möglichkeit, sicherzustellen, dass Ihr Programm die Anforderungen erfüllt, besteht darin, Code zu verbieten, der dies nicht tut. Mit Vigil erledigt es dies automatisch für Sie .

Es gibt andere Möglichkeiten, dies zu tun, da Vigil die Schlüsselwörter bereitstellt imploreund sweardies im Grunde Eide sind, bestimmte Vor- und Nachbedingungen einzuhalten:

def main():
  swear 0 > 1
Martin Ender
quelle
116
Kein Zweifel, das verdient es zu gewinnen.
Matteo Italia
77
Endlich eine ausreichend wachsame Sprache für die Moderne! Ich werde es in der Produktion einsetzen. Alle Bugs müssen gelöscht werden.
Claudiu
13
Mir scheint, dass es nicht unbedingt die Schuld der Funktion ist, die eine unaufgefangene Ausnahme auslöst, sondern auch, dass die Funktionen auf dem Aufrufstapel fahrlässig sind, wenn sie diese nicht abfangen. Es könnte sogar darauf hindeuten, dass die Architektur der gesamten Anwendung fehlerhaft ist (weil es vielleicht keine Möglichkeit gibt, diese Ausnahme richtig zu behandeln, ohne den Code neu zu strukturieren?) Kurz gesagt, das gesamte Programm sollte gelöscht werden.
Jonathan Pullano
10
@ JonathanPullano Sie sind nicht der erste, der das bemerkt ;)
Martin Ender
32
Zusätzliche Punkte zum Fluchen. Ein Programm, das ohne Zweifel eine zuversichtliche falsche Aussage macht, muss eliminiert werden.
Orion
293

Ziemlich jede Linux-Distribution, 9 Zeichen

Dieser ist ein Klassiker!

#!/bin/rm

Legen Sie dies in eine Datei und führen Sie es aus:

> ed
a
#!/bin/rm
.
wq foo
> ls
Mail mbox foo
> chmod 777 foo
> ./foo
> ls
Mail mbox

Und es ist weg!

Was ist los: Ich laufe wirklich nur rm! #!wird Shebang genannt . Und wenn Sie einen dieser Befehle gefolgt von einem Pfad zu einer ausführbaren Datei als erste Zeile in Ihrem Skript einfügen, führt der Programmlader Ihre Skriptdatei mit dem aus, was Sie dort geschrieben haben. Die Standardeinstellung ist normalerweise #!/bin/bashoder #!/bin/sh(Bourne-again-Shell / Bourne-Shell). . Das erste Argument, das an dieses Skript übergeben wird, ist der Dateiname selbst (weshalb Sie hier so viele Lösungen sehen, einschließlich %0oder $0und dergleichen). Indem ich meine Datei zum Enthalten #!/bin/rmund Ausführen bringe, übergebe ich nur den Dateinamen meiner Datei an rm.

Flonk
quelle
9
Ohne Linux selbst jemals benutzt zu haben, löscht es meiner Meinung nach die Skriptdatei.
28urous
56
@NateKerkhofs #!startet die Sequenz einen Shebang, der angibt , welchen Interpreter Sie für das Skript verwenden werden - normalerweise /bin/bash. Hier hat Flonk /bin/rmals "Dolmetscher" eingesetzt. rmist ein Programm, das Dateien löscht. Da Linux denkt, dass wir rmein Interpreter sein wollen, übergibt es den Dateinamen als Argument. Daher löscht sich die Datei von selbst
19
Das ist hysterisch
ojblass
25
@ user80551 Ich benötige dafür keinen Root-Zugriff.
Flonk
9
hmm ..../foo mbox
Izkata
241

x86-Binärdatei, 4 Bytes

F0 0F C7 C8

Annahme: Muss auf einer P5 Pentium-CPU ausgeführt werden.

Der obige Befehl ist allgemein als F00F-Fehler bekannt . Es wird versucht, eine ungültige Anweisung mit dem Präfix lock auszuführen .

Dadurch wird die CPU vollständig eingefroren (kein Anhalten oder Neustart), und es ist nicht einmal Root-Zugriff erforderlich.

Dennis
quelle
4
Wow ... das ist wirklich interessant.
Ojblass
31
@JackM: Das wird es, aber das ist in der Frage ausdrücklich erlaubt.
Dennis
34
@JackM, das scheint eine großartige Möglichkeit zu sein, die Ausführung des "Skripts" zu stoppen.
Paul Draper
5
Ich erinnere mich, als dieser Käfer die Runde machte. Eine kernelseitige Problemumgehung wurde fast sofort gefunden - der Computer stürzt erst ab, wenn Sie ein Betriebssystem ohne den Patch ausführen.
zwol
3
@ RosLuP 209 verschiedene Benutzer, anscheinend. Wenn Sie anderer Meinung sind, stimmen Sie ab und fahren Sie fort.
Dennis
150

Bash, 5

>"$0"

Schneidet sich auf die Länge Null ab.

Wenn der Dateiname keine Leerzeichen enthält, >$0funktioniert das für 3 Zeichen !


quelle
2
Tatsächlich werden die Anführungszeichen für eine Variable, die in einem Umleitungsdateinamen wie diesem verwendet wird, nie benötigt, selbst wenn das Programm oder der Pfad zum Programm Leerzeichen enthält, was auf einen Sonderfall bei Shell-Parsing-Regeln zurückzuführen ist. So können Sie es immer in 3 Zeichen tun!
Apenwarr
3
@apenwarr heißt es "$ 0: mehrdeutige Weiterleitung", wenn ohne Anführungszeichen und der Dateiname Leerzeichen enthält
1
@apenwarr, es wird benötigt, wenn die Shell, die dieses Skript interpretiert, auf ksh88 basiert oder sich nicht im posix-Modus befindet. Es geht nicht um Leerzeichen, sondern um beliebige Zeichen $IFSfür bash und Platzhalterzeichen für bash und ksh88. Ein She-Bang-less-Skript wird normalerweise vom sh des Systems interpretiert, aber einige Shells, einschließlich bash und ksh88, interpretieren sie stattdessen in einem eigenen Kind.
sch
144

gzip

#!/bin/gzip

Zu viel Ärger für Leute, die es gewohnt sind, zerstörungsfreie Kommandozeilen-Tools zu verwenden, gzipruiniert standardmäßig die Originaldatei und ersetzt sie durch eine komprimierte Version (mit einem Suffix).

Dies ist eine Variation der #!/bin/rmOption, mit der Ausnahme, dass diese durch manuelles Eingreifen von Personen wiederhergestellt werden kann (Aufruf gunzip). Als besonderer Bonus ist die resultierende Datei viel länger als das Original (der Unterschied hängt von der Länge des Dateinamens ab).

Warnung: Die Position von gzipkann variieren.

EDIT: wie von WChargin herausgestellt, ist dies portabler:

#!/usr/bin/env gzip

Der Rest der Datei kann einen beliebigen Inhalt haben. Es ist im Wesentlichen eine Datei, die sich beim Aufrufen in einer Box versteckt und sich weigert, herauszukommen, bis Sie sie gewaltsam entpacken.

orion
quelle
7
Ich habe noch nie darüber nachgedacht, aber Sie haben absolut Recht.
Ojblass
sehr interessant
Grijesh Chauhan
11
"Warnung: Die Position von gzipkann variieren" - dies ist kein Code-Golf , daher können Sie#!/usr/bin/env gzip
wchargin
37
+1 nur für It's essentially a file that, when called, hides itself in a box and refuses to come out until you forcibly unpack it.Sie hat meinen Tag gemacht, und es ist 1 Uhr morgens.
klatschen
Es ist im Wesentlichen eine Datei, die sich beim Aufrufen in einer Box versteckt und sich weigert, herauszukommen, bis Sie sie gewaltsam entpacken. hat mich zum Lachen gebracht. : D
Mischa
121

Bash, 13 12

Nicht die kürzeste, aber sie löscht die Datei nicht und macht das System nicht unbrauchbar.

chmod 0 "$0"

Wenn der Dateiname keine Leerzeichen enthält, können Sie die Anführungszeichen entfernen, um 2 Zeichen zu sparen.

Erläuterung

Es entfernt alle Berechtigungen ( rwx) von sich. Wenn Sie versuchen, den Code ein zweites Mal auszuführen oder sogar anzuzeigen, ohne die Berechtigungen manuell wiederherzustellen, wird etwa Folgendes angezeigt

bash: <FILENAME>: Permission denied

Stellen Sie die Berechtigungen mit wieder her

chmod +rwx <FILENAME>

Alte Version

Entfernt nur die Ausführungsberechtigungen, aber ein Zeichen länger (dies war eine Frage, bevor sie zum geändert wurde ):

chmod -x "$0"

Hinterhältige Fassung von Łukasz Niemier

#!/bin/chmod 0

quelle
4
chmod 0funktioniert auch
gnibbler
@ Gnibbler Thnx, hinzugefügt
Ich denke, Sie können das Programm aufrufen aund noch 3 Zeichen speichern:chmod 0 a
yo '
@tohecz, die im Grunde aber betrügt
5
Noch schöner#!/bin/chmod 0
Hauleth
112

6800 Maschinencode - 1 Byte

0xDD

Dies wird als HCF oder Halt and Catch Fire bezeichnet

Knabberzeug
quelle
78
Nun, die Regeln sagen "Alle Antworten, die nur einen Neustart oder einen Stopp einleiten, werden disqualifiziert", aber dies löst nicht nur einen Stopp aus, weil es auch Feuer fängt. Also +1!
Trejkaz
94

Shell + sed, 16 Bytes

Nicht ganz so destruktiv wie einige der anderen Antworten ;-)

Dieses Skript fügt #am Anfang jeder eigenen Zeile einen Kommentar ein :

sed -i s/^/#/ $0
Digitales Trauma
quelle
3
Wie wäre es sed -i g $0?
Seshoumara
91

Commodore 64 BASIC

Dieser löscht das Programm nicht.

1 POKE 2048,1

Selbstzerstörung

Gemäß der Commodore 64-Speicherzuordnung wird die Adresse 2048nicht verwendet, sie muss jedoch den Wert "" enthalten, 0damit das BASIC-Programm ausgeführt werden kann.

Danko Durbić
quelle
1
Verschiebt Poke eine Variable einfach an einen Ort?
Ojblass
12
@ojblass ja, effektiv. poke a, bentspricht dem C-Code *((unsigned char *)a) = b;.
Jules
4
Ich möchte meine FaceBook-Pokes auf diese Weise visualisieren!
Sunny R Gupta
3
Oh wow ... ich erinnere mich an PEEK und POKE von C64 BASIC! Ich schrieb dieses Zeug um 1977.
Fixee
Randnotiz: Ein 0Byte wird verwendet, um das Ende von Codezeilen zu markieren; Die Adresse 0x800 benötigt wahrscheinlich eine, um den Anfang der ersten Codezeile zu markieren.
Titus
89

Annahme: Ausführen von Solaris, angemeldet als root

killall
Greg Hewgill
quelle
3
Hat Solaris wirklich so etwas?
Ojblass
21
Ja, es macht genau das, was es verspricht und bricht alle laufenden Prozesse ab.
Greg Hewgill
eine positive Bewertung für Sie!
Ojblass
9
1. In der Frage wird erwähnt, dass kein Root-Zugriff zulässig ist.
user80551
119
@ user80551 Er ist der Grund für diese Regel.
Seiyria
68

Python, 18

open(__file__,'w')

Schneidet die Datei ab, indem sie im schreibgeschützten Modus geöffnet wird.

segfaultd
quelle
14
Nur für den Fall, dass Sie es ernst meinen, öffnet es sich selbst ( __file__verweist auf seinen eigenen Dateinamen). Das Öffnen im wModus schneidet die Datei ab und löscht sie im Grunde.
Bob
7
Ich denke, das Abschneiden geschieht beim Öffnen, aber unabhängig davon, ob die Python-Laufzeit alle geöffneten Dateien am Ende des Programms leeren soll, und entweder Python oder das Betriebssystem wird sie schließen, wenn der Prozess endet. Natürlich ist es im Allgemeinen eine gute Praxis, offene Handles explizit zu schließen, wenn Sie damit fertig sind.
Bob
5
Die "richtige" Art, mit Dateien in Python umzugehen, ist mit, mit. with open("myfile.txt","r") as thefile:und dann schließt Ihr Dateihandhabungscode die Datei automatisch, wenn Sie fertig sind.
Schilcote
1
Dies könnte auf so etwas wie gekürzt werden open("f.py","w").
Ethan Bierlein
1
Hört nicht auf zu arbeiten, wenn .pyc bleibt
minmaxavg
66

Batch: 5 Bytes

%0|%0

Es ist im Grunde die Forkbomb für Windows.

Die App beginnt ihr erstes Argument zweimal. Lass es nicht in einer produktiven Umgebung laufen;)

Knerd
quelle
83
Gibt es eine produktive Windows-Umgebung? (Ich scherze natürlich).
Orion
17
es sieht so unschuldig aus!
Ojblass
15
Ok, versuche das definitiv nicht. Es ist nicht gut gelaufen.
rmobis
75
Ich habe nicht den Repräsentanten, der abstimmt, aber es verletzt "nur einmal laufen" auf die schwerste Art und Weise, die möglich ist.
Xan
14
Ich glaube, ein Mensch führt es nur einmal aus und es ist qualifiziert.
Ojblass
54

JavaScript

localStorage.x = eval(localStorage.x + localStorage.x)

Wenn Sie es zum ersten Mal ausführen, funktioniert es einwandfrei:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
NaN

Wenn Sie versuchen, es mehr auszuführen (auch wenn Sie es aktualisieren), wird eine Fehlermeldung angezeigt:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
ReferenceError: NaNNaN is not defined
Casey Chu
quelle
5
Wenn Sie es also häufig ausführen, erhalten Sie das Batman-Thema. +1 dafür.
Hankrecords
2
@Hankrecords Leider nicht wirklich, da dies nicht später ausgeführt wird ...
RedClover
@ Soaku Bummer ...
Hankrecords
@Hankrecords, es sei denn, Sie entfernen eval, aber dann wird es diese Herausforderung nicht erfüllen
RedClover
46

Das IBM CMS-Betriebssystem, ein Einzelbenutzer-Betriebssystem, das als Gast unter IBM VM Hypervisor ausgeführt wird, weist eine interessante Dateistruktur auf.

Dateien bestehen aus drei Elementen: Dateiname, Dateityp und Dateimodus. Der Dateimodus besteht aus zwei Elementen, einem einzelnen Buchstaben, der der Einfachheit halber ähnlich wie der Laufwerksbuchstabe für Windows / MS-DOS angesehen werden kann, und einer einzelnen numerischen Ziffer.

Die einzelne Ziffer hat für diese Aufgabe die Bedeutung http://publib.boulder.ibm.com/infocenter/zvm/v5r4/index.jsp?topic=/com.ibm.zvm.v54.dmsa3/hcsd0b10127.htm Es ist die Nummer 3, die interessant ist:

Dateimodus Nummer 3 Der
Dateimodus Nummer 3 bedeutet, dass Dateien nach dem Lesen gelöscht werden. Sie können den Dateimodus 3 verwenden, wenn Sie keine Kopien auf Ihren Minidisks oder in Ihren SFS-Verzeichnissen verwalten möchten.

Verbringen Sie also Stunden damit, Ihr Skript zu schreiben und es als "LOST FOREVER A3" abzulegen. Führen Sie es aus, es funktioniert beim ersten Mal. Nach Hause fahren, gute Arbeit geleistet.

Es wird keine Meldung angezeigt, die das Löschen angibt. Schließlich weiß jeder, was das 3bedeutet, nicht wahr?

Es ist natürlich sehr nützlich. Sie können nach Abschluss des Tests die Option 3für temporäre Dateien verwenden und müssen anschließend nicht bereinigen, da es sich um einmal gelesene Dateien handelt.

Bill Woodger
quelle
44

Commodore 64 BASIC

0 NEW

NEW löscht das Programm.

Danko Durbić
quelle
1
Was macht das
Darth Egregious
3
@ User973810 Wenn ich mich an Basic erinnere, ist neu für die Speicherbereinigung, so wird das Programm gelöscht
User902383
3
Nett. Nicht spezifisch für Commodore 64, funktioniert wahrscheinlich so wie auf fast jedem 8-Bit-BASIC-Rechner aus den 80er Jahren ...
5.
Sie könnten ALT oder O. es auch zurück. Ich habe 12 Monate des 12-jährigen Game-Coding-Genies kennengelernt und arbeite einmal aus Versehen. Dann versehentlich gespeichert statt veraltet. O. hat nicht mehr funktioniert :( Ich habe gelernt, wie Hex-Editoren ziemlich scharf arbeiteten :)
Matt Warren
3
@ysap: Es wäre portabler, wenn es 1 als Zeilennummer verwenden würde; Nicht alle BASIC-Implementierungen unterstützten Zeilennummer 0.
Celtschk
41

Bash, 12

Hinweis: Dies ist destruktiv.

:(){ :|:&};:

Es ist die beliebte Bash-Gabelbombe. Es frisst exponentiell den gesamten Speicher und die PIDs, die das System blockieren. Durch einen Hard-Neustart kann der Code erneut ausgeführt werden. Warum sollten Sie das tun?


Bash, 10

:(){ :&};:

Bei zwei weniger Zeichen wird Ihr Gedächtnis dadurch linear aufgefressen.


Bash, 7

w;PATH=

w wird als die kürzeste ausführbare Datei ausgewählt, die ich mir vorstellen kann.

Dadurch wird die Pfadvariable einfach gelöscht, sodass die Shell /usr/bin/wdas nächste Mal nicht finden kann . Durch einen Neustart der Shell wird das Problem behoben, da der Pfad normalerweise in gespeichert ist~/.profile

user80551
quelle
Darn it: DI hatte gerade die gleiche Idee: P
Knerd
1
:(){ :&};:sollte nicht dein Gedächtnis essen. Es stoppt, sobald es gegabelt hat, es ist also immer nur O(1)aktiv. Sie haben getan while(fork());, was Ihr Gedächtnis linear fressen würde, ist das Äquivalent von fork(); while(1);.
Marinus
26
Beeindruckend! Das sind einige tödliche Emotionen! Ich nenne meinen Computer am besten nicht bignosed frownyface :(){ ....
Level River St
1
Wenn ich mich richtig erinnere ... lässt die Gabelbombe regelmäßig eine PID offen. Das Skript kann in diesem Intervall erneut ausgeführt werden ... und wenn dies nicht zählt, können Sie mit etwas Aufwand alle Gabeln töten. Ein Neustart ist einfach die einfachste Lösung.
Brilliand
11
Ich denke nicht, dass dies geeignet ist. Es macht es nicht unmöglich, dass das Skript erneut ausgeführt wird, sondern garantiert, dass es erneut (mehrmals) ausgeführt wird.
Ben Voigt
20

C #

Kürzester Code zum Löschen von self

Process.Start(new ProcessStartInfo("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location + "\""));

Code, der die Benutzeroberfläche unbemerkt lässt

Process.Start( new ProcessStartInfo()
{
    Arguments = "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location+"\"",
    WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, FileName = "cmd.exe"
});
BenVlodgi
quelle
7
Endlich eine C # Antwort!
Pharap
Warum ist eine Auswahl erforderlich?
wizzwizz4
19

C ++ 71

Der ausführbaren Datei "golf" wird die Berechtigung zum nächsten Ausführen verweigert.

#include <stdlib.h>
int main()
{
system("chmod a-x golf");
return 0;
}

JavaScript / HTML 137, 145 mit Konsolentest

<script id="s"> 
function h(){
console.log(1);
var s=document.getElementById("s");
h=s.innerHTML;
h=h.replace("h","g");
s.innerHTML=h;
}
Bacchusbeale
quelle
11
@Templar im Kontext von JavaScript denke ich, dass das Aktualisieren der Seite als Neustart (vielleicht?)
2
Selbst wenn Sie das Skript nicht von der Seite entfernen, wird es nur einmal ausgeführt. Das hat keinen Sinn.
Nderscore
2
@nderscore Sieht so aus, als würde die Funktion h nur einmal ausgeführt. Sie müssen es tatsächlich von einem anderen Ort aus aufrufen (analog zum Ausführen eines Programms, denke ich). Sprich <button onclick="h();">.
Bob
4
Da das Neuladen der Seite erlaubt ist und Sie nur verhindern möchten, dass h mehr als einmal ausgeführt werden kann, während es bereits geladen ist, was ist falsch daran function h(){h=0}?
Keen
1
Mit können #include <sys/stat.h>Sie chmoddirekt auf die Funktion zugreifen und einige Bytes einsparen ( <stdlib.h>wird nicht mehr benötigt und auch nicht system). Auch nein returnwird benötigt.
Ben Voigt
19

Mein Name ist Shell ... PowerShell

Klassische selbstzerstörende Nachricht:

@'
##################################
Project X is a go

Meet Eagle 1 at WP Alpha

Further comms is hereby prohibited
##################################
This message will self destruct in 
5 seconds
'@
5..1| %{$_;Sleep 1;}
"Goodbye"
rm $(.{$MyInvocation.ScriptName})
SomeShinyObject
quelle
Erklärung, bitte?
noɥʇʎԀʎzɐɹƆ
@ noɥʇʎԀʎzɐɹƆ Zeilen bis 13 sind nur Quatsch. Danach lädt PowerShell wie jede andere Shell das ausgeführte Skript in den Speicher und benötigt daher nicht mehr die ursprüngliche Skriptdatei ... und löscht sich von selbst.
SomeShinyObject
18

Bash (5)

rm $0

Angenommen, Sie haben keine Leerzeichen im Dateinamen.

Marinus
quelle
40
Deshalb ist Unix besser als Windows: rm statt del hat dir ein Byte gespart.
MadTux
1
@MadTux Ich bevorzuge * nix gegenüber Unix.
wizzwizz4
14

Sch

#!/bin/sh
curl http://runonce.herokuapp.com/

Wird nur einmal ausgeführt (und zeigt "Hallo Welt!", Wenn es ausgeführt wird), auch wenn Sie das System neu installieren und das Skript erneut ausführen.


EDIT: Ich dachte, ich würde auch ein Skript hinter runonce veröffentlichen. Nichts Besonderes, denn es sollte auf keinen Fall veröffentlicht werden, aber wie auch immer.

<?php
$db = pg_connect("[connection information]");
$ip = isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];

pg_query("DELETE FROM users WHERE time < now() - interval '1 day'");

$result = pg_query_params($db, "SELECT * FROM users WHERE ip = $1 LIMIT 1", array($ip));

if (!pg_fetch_row($result)) {
    echo "Hello, world!\n";
    pg_query_params($db, "INSERT INTO users (ip) VALUES ($1)", array($ip));
}

Sowie Datenbankschema

CREATE TABLE users (
    ip inet PRIMARY KEY,
    time timestamp with time zone NOT NULL DEFAULT now()
);
CREATE INDEX ON users (time);

Die Daten werden in der Datenbank von Heroku gespeichert. Wenn Sie möchten, können Sie deren Datenschutzbestimmungen überprüfen . Ich überprüfe die in einer Datenbank gespeicherten Daten nicht, sondern nur, damit der Code einmal ausgeführt werden kann.

Konrad Borowski
quelle
4
Ich würde argumentieren, dass dies mehrere Male ausgeführt wird, es wird nur nach dem ersten keine Ausgabe erzeugt.
Brilliand
5
Das hat mir nicht mal "Hello World" gezeigt.
Paŭlo Ebermann
1
@ StéphaneGourichon: Ja, es speichert IPs und es gibt keine Möglichkeit, eine IP vor dem automatischen Entfernen zu entfernen. Ich habe beschlossen, den Quellcode zu setzen, damit Sie überprüfen können, was es tut.
Konrad Borowski
1
@ StéphaneGourichon: pg_query_paramsschützt so ziemlich vor SQL-Injection. Es wird jedoch nicht gespeichert, da '; DROP TABLE users;--es sich nicht um eine gültige IP- inetAdresse handelt (es werden nur IP-Adressen akzeptiert). Wenn Sie also einen falschen X-Forwarded-ForHeader haben, wird Ihr Besuch nicht gespeichert. Ich betrachte es selbst nicht als Problem.
Konrad Borowski
2
Ich glaube, dass dies eine Verletzung einer Standardlücke ist: Auslagerung der eigentlichen Antwort .
juniorRubyist
12

PHP, 22 bis 20 Zeichen

<?=unlink(__FILE__);

BEARBEITEN: Zwei Zeichen am Ende pro Kommentar entfernt.

Jay
quelle
2
Dies kann noch weiter vereinfacht werden, da <?unlink(__FILE__);das Nachziehen ?>nicht erforderlich ist
Leepowers
Sie müssen mit beginnen <?=oder das Start-Tag wird nicht erkannt.
Michael Mior
2
PHP zerstört sich selbst ... ha! E_NOTICE Zeile 3048
Metadings
<?+ platz ist auch ok Sie können nach dem kurzen Tag einfach keinen Buchstaben verwenden.
Titus
11

Rubin, 14

Der Quellcode wird als Name des Programms neu geschrieben.

IO.write $0,$0
Mhmd
quelle
3
Und was ist, wenn das Programm "IO.write $ 0, $ 0" heißt? "Annahme: Benennen Sie das Programm mit einem Namen, der in keiner Sprache gültig ist."
Brilliand
@Brilland Ein Ruby-Programm sollte immer mit enden, .rbund selbst wenn sein Name "IO.write $ 0, $ 0 # .rb" lautete, funktioniert dies nicht, da es beim Schreiben den vollständigen Pfad enthält.
Mhmd
3
@Mhmd Ein Ruby-Programm kann mit allem enden. Zum Beispiel gemund irbsind Ruby-Programme ohne Erweiterung.
Bfontaine
@bfontaine Welche shebangs haben. Das tut es nicht.
wizzwizz4
@ wizzwizz4 Shebangs haben nichts mit der Erweiterung zu tun. ruby foound ruby foo.rbwird das gleiche mit oder ohne shebang arbeiten. ./foound ./foo.rb(unter der Annahme, dass sie ausführbar sind) werden beide fehlschlagen, ohne dass sie es schaffen und damit Erfolg haben (unter der Annahme, dass der Code korrekt ist usw.).
Bfontaine
10

Batch (6 Zeichen)

Dies setzt voraus, dass wir die Erlaubnis haben, die Datei zu löschen. Dies kann natürlich auch unter Windows (möglicherweise auch unter MS-DOS) erfolgen.

del %0
Justin Krejcha
quelle
10

Bash 9 8 Zeichen

nc -l 1&

Läuft nur einmal, da der Port für immer gesperrt ist.

Falco
quelle
1
Ich denke, das funktioniert nicht, da 0es sich um einen speziellen Port handelt (der reserviert ist). Wenn ich dies auf meinem Computer ausführe, kann ich es mehrmals öffnen. Es ist auch ein Port < 1024, was bedeutet, dass Root-Zugriff erforderlich ist, um abgehört zu werden.
heinrich5991
nc -l 1&würde das problem mit beheben 0und ein byte kürzer sein, da der letzte platz nicht benötigt wird.
Kasperd
@kasperd Danke für die Eingabe :-)
Falco
@ heinrich5991 ok - dann bräuchte ich 11 Zeichen ohne root-Zugang, um einen Port wie 9654 zu benutzen
Falco
Möchtest du erklären, warum du zurückgestimmt hast?
Falco
9

NodeJS - 33 Bytes

require('fs').unlink(__filename);
cPu1
quelle
Können Sie beschreiben, was dies für diejenigen bedeutet, die mit der Sprache nicht vertraut sind?
Kyle Kanos
1
@KyleKanos Ruft das Dateisystemmodul fsund den aktuellen Dateinamen ab __filenameund entfernt diesen Dateinamen aus dem Dateisystem.
Keen
7
Sie können das Semikolon entfernen, da diese in JavaScript optional sind.
Nalply
8

Batch, 7 Zeichen

Speichern Sie nicht gespeicherte Arbeit, bevor Sie dies versuchen.

Es wird entweder ein 64-Bit-System oder ein 32-Bit-System mit <2 GB RAM-Speicher vorausgesetzt. Muss vor dem Start in einer .bat- oder .cmd-Datei gespeichert werden. Die Eingabe in cmd.exe funktioniert nicht.

^ nul<^

Es verbraucht einen vollen CPU-Kern und füllt Ihren RAM-Speicher mit einer Geschwindigkeit von mehreren hundert Megabyte pro Sekunde. Wenn Sie es nicht rechtzeitig stoppen (Task-Manager), wird jedes Byte des Arbeitsspeichers auf Ihrem Computer belegt, Ihr gesamtes System wird einfrieren und Sie können nichts tun, bevor Sie Ihren Computer durch Schneiden zwangsweise herunterfahren und neu starten Schalten Sie das Gerät ein oder halten Sie die Ein / Aus-Taste gedrückt.

Alle Credits gehen dazu auf StackOverflow an txtechhelp, weitere Informationen finden Sie hier: https://stackoverflow.com/q/23284131/1955334

bilde2910
quelle
Wie wäre das möglich? Was ist mit Paging? Prozesspriorität ?
Nicolas Barbulesco
Ich habe dieses Skript ausgeführt, es ist nichts passiert.
Pavel
@Pavel Ich denke, es ist dann in Windows 10 behoben. Ich kann es nicht unter Windows 10 reproduzieren, aber es funktioniert unter Windows 8.1.
Bilde2910
1
"Es verbraucht einen vollen CPU-Kern und füllt Ihren RAM-Speicher mit einer Rate von mehreren hundert Megabyte pro Sekunde. Wenn Sie es nicht rechtzeitig stoppen (Task-Manager), wird jedes Byte RAM auf Ihrem Computer, Ihrem gesamten System, verbraucht friert ein und Sie können nichts tun, bevor Sie Ihren Computer mit Gewalt heruntergefahren und neu gestartet haben, indem Sie den Strom abschalten oder den Netzschalter gedrückt halten. " Klingt nach einer Horrorgeschichte für Computer ...
noɥʇʎԀʎzɥʇʎԀʎ
7

Hier ist ein paar. Im Gegensatz zu vielen anderen sind diese nicht destruktiv, sondern nur kreativ und unorthodox.

Bash

#!/usr/bin/env bash
read <<< ''
printf "$REPLY" > "$0"

Das ist ziemlich einfach. Die Variable $REPLYwird implizit von erstellt read, aber mit einem leeren Herestring gefüllt. Diese leere Zeichenfolge wird dann printfin das aktuelle Skript eingefügt. Es ist ein eher verschleiertes Äquivalent von Folgendem:

#!/usr/bin/env bash
cat <<< '' > "$0" # probably a lot more portable

Windows Batch

copy con %0 < nul

Der zweite kopiert im Grunde die Konsolen-Eingabe, aus der gelesen wurde nul, in die aktuelle Datei.

Isiah Meadows
quelle
Nachdem dies ein Beliebtheitswettbewerb wurde
Isiah Meadows
1
Der erste funktioniert nicht ohne Root-Berechtigungen. Warum versuchen Sie, das Nullgerät zu ersetzen? Wenn es als root ausgeführt wird, würde dies tatsächlich zu einem fehlerhaften Verhalten des Systems führen. Sie überschreiben auch die Null, während Sie darin schreiben :) Warum nicht einfach irgendwo anders hin verschieben? Wie mv "$ 0" "$ {0} x" oder so? Es sollte den Trick machen.
orion
Existiert die Datei danach noch?
Isiah Meadows
Ich habe jetzt das Bash-Beispiel komplett geändert.
Isiah Meadows
Wie sind diese nicht destruktiv?
ysap
7

Sinclair BASIC

10 POKE 23635,255

Verschiebt die Adresse des BASIC-Programms im Speicher von der Position, an der es sein sollte (203), damit der Interpreter die falschen Daten findet.

kitcar2000
quelle