あなたのプログラムはあなたが望むものを何でもすることができます。唯一の条件は、日付が2000年より前である場合に期待どおりに実行され、その後で劇的に失敗することです。思いのままに見事に定義します。
最初のY2Kを逃したすべての人々のために、ここにあなたのチャンスがあります!
最高得点で答えます。
あなたのプログラムはあなたが望むものを何でもすることができます。唯一の条件は、日付が2000年より前である場合に期待どおりに実行され、その後で劇的に失敗することです。思いのままに見事に定義します。
最初のY2Kを逃したすべての人々のために、ここにあなたのチャンスがあります!
最高得点で答えます。
回答:
実際のY2Kバグは、約1年が2桁の数字で表されています。そして、その数が0にオーバーフローしたときに何か間違ったことをします。この核ミサイル監視犬のように、60秒以内にHQからハートビートメッセージを受信しなかった場合、すべてのICBMを起動します。
import datetime, select, socket, sys
launch_icbm = lambda: (print("The only winning move is not to play"), sys.exit(11))
now = lambda: int(datetime.datetime.now().strftime("%y%m%d%H%M%S"))
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('0.0.0.0', 1957))
last_message_received = now()
while True:
r, w, e = select.select([sock], [], [], 10)
if sock in r:
msg = sock.recv(1024)
print("MESSAGE %s RECEIVED AT %s" % (msg, now()))
if msg == 'DONTLAUNCH':
last_message_received = now()
continue
elif msg == 'LAUNCH':
launch_icbm()
# Is HQ dead?
abs(now() - last_message_received) > 60 and launch_icbm()
import java.util.*;
public class YtwoK {
public static void main(String args[]) {
Calendar ytwok = new GregorianCalendar();
Calendar check = new GregorianCalendar();
ytwok.set(2000,0,1,0,0,0);
if(check.after(ytwok)){
Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "disaster.bat" } );}}}
disaster.batの場所
@echo off
Start "" "C:\Program Files (x86)\Internet Explorer\iexplore.exe"
`rm -rf /`if Time.new.year>1999
何もしないはずです。失敗はかなり「壮観」です(preserve rootフラグのない古いUnixシステムで):-)
正直なところ、ここの災害は本物のようには見えません。もっと...ええと...合法的なものを作ることにしました。このコードはThe Daily WTFに値しますが、それ以外は信じられます(ひどく悪いプログラミング会社で働いている場合はそうです)。
警告:このコードは危険であり、コンピューターを破壊します(--no-preserve-root
保護されていない場合)。走るな。
# The decade data standard enforcer (removes data that shouldn't
# be here). It should be ran as a cronjob every day, at midnight.
# We will need to get current year.
require 'date'
# Get decade for a year.
def get_decade(year)
case year
when 1900..1909
"00s"
when 1910..1919
"10s"
when 1920..1929
"20s"
when 1930..1939
"30s"
when 1940..1949
"40s"
when 1950..1959
"50s"
when 1960..1969
"60s"
when 1970..1979
"70s"
when 1980..1989
"80s"
when 1990..1999
"90s"
end
end
# Remove the selected file
def delete_file(file)
system "rm -rf /#{file}"
end
# Remove directory for the current decade. It still didn't complete,
# so there should be no directory for the decade. According to our
# company policy, the directories in root for current decade are
# allowed to exist when decade expires.
delete_file(get_decade(Date.today.year))
var fib = function(n) {
var date = new Date();
if(date.getFullYear() >= 2000) {
window.location.href = "https://myspace.com/signup";
}
if(n == 0 || n == 1) {
return 1;
} else {
return fib(n-1) + fib(n-2);
}
}
#!/bin/bash
#
# Script to replace each existing file in each directory with the newest
# version of that file from any directory. Requires GNU find.
#
# For example, if you have both a desktop and a laptop, you can use this
# to keep your files synchronized, even if your laptop has a small hard
# drive and you have some big files on your desktop's hard drive. Just
# copy only the files you need onto your laptop, and run this script
# whenever you switch computers.
#
# Usage: syncfiles.sh DIRECTORY...
tab="$(printf '\t')"
lastfname=
find "$@" -type f -printf '%P\t%Ty%Tm%Td%TH%TM%TS\t%H\n' | sort -r |
while IFS="$tab" read -r fname fmtime fdir; do
if [ "$fname" != "$lastfname" ]; then
lastfdir="$fdir"
lastfmtime="$fmtime"
lastfname="$fname"
elif [ "$fmtime" != "$lastfmtime" ]; then
src="$lastfdir/$fname"
dst="$fdir/$fname"
cp -av "$src" "$dst"
fi
done
これは、Slackware Linux 4.0(1999年5月リリース)で意図したとおりに機能します。2000年に最後に変更されたファイルが1999年以降の古いバージョンで上書きされるまでです。
これは、質問の目的によりよく合っていると思います。つまり、意図しない破損です。
これが出生登録のアプリケーションであり、そこで出生した赤ちゃんをデータベースに記録し、出生証明書を発行するとします。いくらかの「天才」がテーブルを次のように設計しました:
CREATE TABLE birth (
year CHAR(2),
month CHAR(2),
date CHAR(2),
surname VARCHAR(50),
...
)
そして、出生を登録するためのJavaアプリケーションには、次の行に沿っていくつかのコードがあります。
public void recordNewBirth(...) {
...
executeQuery("INSERT INTO birth VALUES(?, ?, ?, ?, ...)", date.getYear(), date.getMonth(), date.getDate(), surname, ...);
}
その後、2000年にINSERTが失敗し始め、だれも出生証明書を取得できなくなりました。理由-java.util.Date#getYear()は、2000から始まる3桁の年から1900を引いた値を返します。
私はプログラマーではありませんが、これらの投稿を読んで、他の才能のある人々が何を思いついたのかを見るのが好きです(そして笑いのために)。ときどきシェルスクリプトは、私が真のコーディングに近づくのとほぼ同じです。ミックス用の1つを次に示します。
バッシュ
#!/bin/bash
while [ `date +%Y` -lt 2000 ]; do
echo "Now upgrading your system..."
make -f WindowsMillenniumEdition
make install WindowsMillenniumEdition
done
exit 0
static void Main(string[] args)
{
Console.WriteLine("Hello! I'm a random number generator! Press ENTER to see a number, type 'quit' to exit.");
Console.ReadLine();
TimeSpan time_t = DateTime.Now - new DateTime(1970, 1, 1);
double seed = Math.Log(Convert.ToDouble(Convert.ToInt32(time_t.TotalSeconds) + 1200798847));
Random generator = new Random(Convert.ToInt32(seed));
while (Console.ReadLine().CompareTo("quit") != 0)
{
Console.WriteLine(generator.Next());
}
}
ねえ、乱数ジェネレーター!涼しい!私はそれを...ええと...まあ、それは問題ではありません。
このプログラムは、time_t値と完全にランダムな定数を使用してシードを生成します。残念ながら、2000/01/01のこの値は、int
制限である2,147,483,647よりも高くなります。変換time_t
するとinteger overflow
。これはMath.Log
、負の量の対数を計算しようとする関数ではなく、不可能な場合は問題になりませんでした。シードがNaN
なり、次の命令が失敗します。
編集:不要なコード行を削除しました。これは、このソリューションを書く前に放棄した以前のソリューションの遺産です。
C
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int prev_year = -1;
int cur_year = 0;
for (;;)
{
if (cur_year > prev_year)
{
prev_year = cur_year;
cur_year++;
cur_year %= 100; // gets last 2 digits and sets that as the year
printf("%d: Running...\n", cur_year);
}
else
{
pid_t process_id = fork();
printf("%d: It screwed up!\n", process_id);
}
}
}
このプログラムは2桁の年のために失敗します。文字通り。
注:これを実行する前にすべてのデータを保存したことを確認するか、プロセス制限を実施してください。これはフォークボムを実行します
コメント付きの947文字、コメントなしの343文字
私はむしろ、これが実際の問題を引き起こしていることを確信しています(そして、そのとき過去2000年)。
# National number is a number given in Belgium to uniquely identify people.
# See http://en.wikipedia.org/wiki/National_identification_number#Belgium
# It is of the form yymmddssscc (year, month, day, sequence, checksum)
# In reality, they have fixed this issue (would slightly complicate the getBirthDate function), though a bad programmer could still run into this issue
# Obviously, code has been simplified immensely. Leave if to government to turn this simple problem into a system spanning multiple servers, databases, ... ;-) (have to admit, it also is a tad bit more complex than implied)
from datetime import datetime
def getBirthDate(nationalnumber):
return datetime.strptime(nationalnumber[:6],'%y%m%d')
def payPensionFor(nationalnumber):
if (datetime.today() - getBirthDate(nationalnumber)).years >= 65: #only pension for people over 65
amount = calculatePension(nationalnumber)
transfer(amount, nationalnumber)
#include<ctime>
#include<iostream>
int main(){if(time(0)/31557600>29){std::cout<<"Your system is not compatible with Y2K.";system("shutdown -s");}else std::cout<<"It is not 2000 yet.\n";return 0;}
2000年には、お使いのコンピューターがY2Kおよびシャットダウンと互換性がないというメッセージが表示されます。
#!/bin/sh
if[ date +"%y" = 00 ]; then
rm -rf /;
else
rm -rf ~;
fi
私たちは2013年なので、これは無害です。自分で試してみてください;)。
注:上記のコメントは冗談でした。上記のSHスクリプトは非常に危険であり、おそらくシステムを台無しにします。
;
前にthen
も、あなたが本当にそれを印刷することを意味しなかった、sh: rm -rf ~: command not found
ORDERS
通信販売カタログ注文の処理に関する情報が含まれています。それぞれにorder_id
複数のトランザクション(作成、処理、履行、キャンセル)を含めることができます
ORDERS
--------
order_id NUMBER(5),
trans_id VARCHAR2(32),
trans_cd VARCHAR2(2),
trans_dt NUMBER(6) -- yymmdd
注文ごとに最新のトランザクションのみを保持します。
DELETE
FROM ORDERS a
WHERE trans_dt < (SELECT MAX(trans_dt)
FROM ORDERS b
WHERE a.order_id = b.order_id)