index + db

This commit is contained in:
gauthiier 2020-01-25 10:57:13 +01:00
parent afc71795d1
commit 56aab9e545
19 changed files with 6027 additions and 158 deletions

44
collate_indexes.py Normal file
View File

@ -0,0 +1,44 @@
import argparse, os, glob, json, logging
import config
def list_all(d, ext):
if not os.path.isdir(d):
logging.error(d + " is not a valid directory.")
return None
return [f for f in glob.glob(os.path.join(d, "*." + ext))]
if __name__ == '__main__':
files = list_all(config.index['path'], 'js')
index = {}
master_fn = os.path.join(config.index['path'], config.index['master'])
if os.path.isfile(master_fn):
with open(master_fn) as master_fp:
try:
index = json.load(master_fp)
except Exception as e:
pass
for f in files:
logging.info("Reading : " + f)
with open(f) as fp:
d = json.load(fp)
selected = d['selected']
for s, vv in selected.items():
if s not in index:
index[s] = {'regex': [s], 'indx': []}
# no duplicates
for v in vv:
if v not in index[s]['indx']:
index[s]['indx'].append(v)
print(json.dumps(index, indent=4, sort_keys=True, ensure_ascii=False))

27
create_db.py Normal file
View File

@ -0,0 +1,27 @@
import os, glob, logging
from db import db
import config
logging.basicConfig(level=logging.DEBUG)
def list_all(d, ext):
if not os.path.isdir(d):
logging.error(d + " is not a valid directory.")
return None
return [f for f in glob.glob(os.path.join(d, "*." + ext))]
if __name__ == '__main__':
db = db.DB(config.list_server_busy_db)
db.create_db()
xml_files = list_all(config.xml['path'], 'xml')
urls_index_file = os.path.join(config.index['path'], config.index['urls'])
for x in xml_files:
db.insert_db(x, urls_index_file)

0
db/__init__.py Normal file
View File

176
db/db.py Normal file
View File

@ -0,0 +1,176 @@
import mysql.connector as mariadb
import os, json, glob, logging
from lxml import etree as et
import db.sql, db.utils
class DB:
db_con = None
def __init__(self, config):
self.db_con = db.utils.connect_db(config['database'], config['host'], config['user'], config['password'])
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
if self.db_con is not None:
self.db_con.close()
def create_db(self, config=None):
logging.info("creating table 'full_digest_rescheduled'")
if self.db_con is None:
if config is not None:
self.db_con = db.utils.connect_db(config['database'], config['host'], config['user'], config['password'])
if self.db_con is None:
logging.warning(" - no connection... Aborting.")
return
try:
cursor = self.db_con.cursor()
cursor.execute(db.sql.CREATE)
except mariadb.Error as error:
logging.error("Error: {}".format(error))
finally:
cursor.close()
logging.info(" - done.")
def insert_db(self, xml_file, urls_index_file, config=None):
if self.db_con is None:
if config is not None:
self.db_con = db.utils.connect_db(config['database'], config['host'], config['user'], config['password'])
if self.db_con is None:
logging.warning(" - no connection... Aborting.")
return
if not os.path.isfile(xml_file):
logging.error(f + " is not a valid file.")
return None
# urls_index_file = os.path.join(config.index['path'], config.index['urls'])
if not os.path.isfile(urls_index_file):
logging.error(urls_index_file + " is not a valid file.")
return None
with open(urls_index_file) as fp:
urls = json.load(fp)
ch = os.path.basename(xml_file).split('.')[0]
root = et.parse(xml_file).getroot()
try:
logging.info("-----------------")
logging.info(os.path.basename(xml_file))
logging.info("-----------------")
cursor = self.db_con.cursor()
for m in root.findall('mails/mail'):
nbr_str = m.find('nbr').text
to_str = m.find('to').text
date_str = m.find('date').text
from_str = m.find('from').text
subject_str = m.find('subject').text
content_str = m.find('content').text
# format nbr
nbr_str = ch + '.' + nbr_str
if nbr_str not in urls:
logging.warning(nbr_str + " is not in urls... skipping.")
continue
url = urls[nbr_str]
date = db.utils.format_date(date_str)
if date is None:
logging.warning("null date: " + nbr_str + " - " + date_str + " - " + from_str)
logging.warning("continuing...")
continue
# aaarrrgghhh
if to_str == "n/a":
to_str = "syndicate@aec.at"
try:
# (nbr_, author_name_, to_, subject_, date_, content_, url_)
logging.info("inserting " + nbr_str)
r = cursor.execute(db.sql.INSERT, (nbr_str, from_str, to_str, subject_str, date, content_str, url))
if r == 0:
logging.warning("error no insert...")
logging.warning(nbr_str + " - " + from_str + " - " + to_str + " - " + subject_str + " - " + date + " - " + content_str + " - " + url)
except mariadb.Error as error:
if error.errno == 1062:
logging.info("+++db+++ duplicate")
continue
else:
logging.warning("Error...")
logging.warning(nbr_str + " - " + from_str + " - " + to_str + " - " + subject_str + " - " + date + " - " + content_str + " - " + url)
continue
self.db_con.commit()
except Exception as e:
raise e
finally:
cursor.close()
def content_search(self, term, bool=True):
if self.db_con is None:
logging.warning("Not connection to database...")
return
try:
cursor = self.db_con.cursor(buffered=True)
if bool:
cursor.execute(db.sql.CONTENT_QUERY_BOOLEAN.format(self.archive_name, term))
else:
cursor.execute(db.sql.CONTENT_QUERY.format(self.archive_name, term))
# nbr_, author_name_, to_, subject_, date_, url_
results = []
for (nbr_, author_name_, to_, subject_, date_, url_) in cursor:
results.append({'nbr': nbr_, 'from': author_name_, 'to': to_, 'subject': subject_, 'date': date_, 'url': url_})
# print("{} {} {}".format(from_, str(date_), url_))
return results
except mariadb.Error as error:
logging.error("Error: {}".format(error))
finally:
cursor.close()
def from_search(self, term, bool=True):
if self.db_con is None:
logging.warning("Not connection to database...")
return
try:
cursor = self.db_con.cursor(buffered=True)
if bool:
cursor.execute(archive.sql.FROM_QUERY_BOOLEAN.format(self.archive_name, term))
else:
cursor.execute(archive.sql.FROM_QUERY.format(self.archive_name, term))
# print(cursor.rowcount)
results = []
for (from_, author_name_, subject_, date_, url_) in cursor:
results.append((from_, author_name_, subject_, date_, url_))
# print("{} {} {}".format(from_, str(date_), url_))
return results
except mariadb.Error as error:
logging.error("Error: {}".format(error))
finally:
cursor.close()

26
db/listservs.py Normal file
View File

@ -0,0 +1,26 @@
import mysql.connector as mariadb
import dateparser, logging
import db.sql, db.utils
def query_url(db_con, date_str, from_str, table_str):
d = db.utils.format_date(date_str)
auth = db.utils.format_author(from_str)
try:
result = []
cursor = db_con.cursor(buffered=True)
cursor.execute(db.sql.URL_QUERY.format(table_str, auth, d))
for u in cursor:
result.append(u[0])
return result
except mariadb.Error as error:
logging.error("Mariadb error - query_url")
logging.error(error)
return None
except Exception as e:
logging.error("Error - query_url")
return None
finally:
cursor.close()

34
db/sql.py Normal file
View File

@ -0,0 +1,34 @@
CREATE = "CREATE TABLE `full_digest_rescheduled` (" \
"`nbr_` varchar(20) NOT NULL," \
"`author_name_` varchar(200) NOT NULL," \
"`to_` varchar(60) NOT NULL," \
"`subject_` varchar(500) NOT NULL," \
"`date_` datetime NOT NULL," \
"`content_` mediumtext NOT NULL," \
"`url_` varchar(100) NOT NULL," \
"PRIMARY KEY(`nbr_`)," \
"FULLTEXT (`subject_`, `content_`)," \
"FULLTEXT (`author_name_`)" \
") ENGINE = InnoDB;"
INSERT = ("INSERT INTO full_digest_rescheduled"
"(nbr_, author_name_, to_, subject_, date_, content_, url_) "
"VALUES (%s, %s, %s, %s, %s, %s, %s)")
CONTENT_QUERY_BOOLEAN = ("SELECT nbr_, author_name_, to_, subject_, date_, url_ from full_digest_rescheduled "
"WHERE MATCH(subject_, content_) AGAINST('{}' IN BOOLEAN MODE) ORDER BY date_")
CONTENT_QUERY_NL = ("SELECT nbr_, author_name_, to_, subject_, date_, url_ from full_digest_rescheduled "
"WHERE MATCH(subject_, content_) AGAINST('{}') ORDER BY date_")
FROM_QUERY_BOOLEAN = ("SELECT nbr_, author_name_, to_, subject_, date_, url_ from full_digest_rescheduled "
"WHERE MATCH(author_name_) AGAINST('{}' IN BOOLEAN MODE) ORDER BY date_")
FROM_QUERY_NL = ("SELECT nbr_, author_name_, to_, subject_, date_, url_ from full_digest_rescheduled "
"WHERE MATCH(author_name_) AGAINST('{}') ORDER BY date_")
URL_QUERY = ('SELECT url_ FROM {} '
'WHERE author_name_="{}" AND date_="{}"')
SHOW_TABLE = "show tables"

125
db/utils.py Normal file
View File

@ -0,0 +1,125 @@
import mysql.connector as mariadb
import db.sql
import dateparser
def connect_db(database, host, user, password):
try:
con = mariadb.connect(host=host, user=user, password=password, database=database)
except mariadb.Error as error:
logging.error("Error: {}".format(error))
if error.errno == 1049:
logging.error("Database " + database + " does not exist.")
return None
finally:
return con
def list_all_tables(db_con):
try:
cursor = db_con.cursor()
cursor.execute(db.sql.SHOW_TABLE)
results = []
for t in cursor:
results.append(t[0])
return results
except mariadb.Error as error:
logging.error("Error: {}".format(error))
return None
finally:
cursor.close()
def format_date(date_str):
date_time = dateparser.parse(date_str)
if date_time is not None:
return date_time
if '(' in date_str:
date_str = date_str.split('(')[0].rstrip()
date_time = dateparser.parse(date_str)
if date_time is not None:
return date_time
else:
# random stuff...
fix = False
toks = date_str.split()
if len(toks[-1]) == 5 or len(toks[-1]) == 4:
# ex. Thu, 24 Jan 2002 15:21:31 -0000
if toks[-1] in ['+0000', '-0000', '0000']:
date_str = date_str[:-5]
fix = True
# ex. Fri, 25 Jan 2002 13:21:49 +1050
elif toks[-1][-2] == '5':
d = list(date_str)
d[-2] = '3'
date_str = "".join(d)
fix = True
if toks[-1][-1] != '0':
#ex. 'Fri,', '20', 'Jun', '1997', '02:58:59', '-0005'
date_str = date_str[:-5]
fix = True
if 'Fru' in toks[0]:
date_str = date_str.replace('Fru', 'Fri')
fix = True
elif 'Thur' in toks[0]:
date_str = date_str.replace('Thur', 'Thu')
fix = True
date_time = dateparser.parse(date_str)
if date_time is not None:
return date_time
else:
if 'GMT' in date_str:
# ex. 'Mon,', '15', 'Jan', '96', '02:55', 'GMT+0100'
date_str = date_str.split('GMT')[0].rstrip()
fix = True
if 'METDST' in toks[-1]:
# ex. 'Sat,', '3', 'May', '97', '21:07', 'METDST'
date_str = date_str.replace('METDST', 'MET')
fix = True
date_time = dateparser.parse(date_str)
if date_time is not None:
return date_time
else:
return None
def format_author(author_str):
# author_str = author_str.replace('"', '')
if "by way of" in author_str:
toks = author_str.split("by way of")
if toks[0] == "":
author_str = format_from(msg)
elif toks[0][-1] == "(":
author_str = toks[0][:-1].strip()
else:
author_str = toks[0]
if ("(" in author_str) or ("<" in author_str):
# ex. zx {AT} xyz.net (Michel Foucault) OR Michel Foucault (c'estcommeca.com) OR Michel Foucault <zx {AT} xyz.net>
# print("±±±±±±")
# print("name: " + author_str)
# print("from: " + msg['from'])
if not '@' in author_str.lower().replace('{at}', '@').replace(' at ', '@'):
author_str = author_str.split('(')[0].strip()
else:
author_str = email.utils.parseaddr(author_str)[0]
# print(" Name:" + author_str.replace('"', ''))
# print(" From:" + format_from(msg))
if " ," in author_str:
# nettime's_roving_reporter , thing.net {AT} bbs.thing.net
author_str = author_str.split(' ,')[0]
return author_str

View File

@ -25,6 +25,15 @@
- Ch 9.List talking to List - Ch 9.List talking to List
+ 13.0 choose-your-own adventure: a brief history of nettim -> choose-your-own adventure: a brief history of nettime + 13.0 choose-your-own adventure: a brief history of nettim -> choose-your-own adventure: a brief history of nettime
+ this is out... dunno why???
<nbr>24.0-p.471</nbr>
<subject>&lt;nettime&gt; what is going on, on nettime?</subject>
<from>geert</from>
<to>nettime-l@bbs.thing.net</to>
<date>Tue, 17 Aug 2004 11:14:50 +0000</date>
<content>
Well... Alan, nettime being closed off because of lacking nn postings. Many
- Ch 11. CODE - Ch 11. CODE
+ 5.5 should be 6.5 + 5.5 should be 6.5

4034
index/index.master Normal file

File diff suppressed because it is too large Load Diff

1229
index/urls.master Normal file

File diff suppressed because it is too large Load Diff

153
index_url.py Normal file
View File

@ -0,0 +1,153 @@
import argparse, os, glob, json, logging, collections
import db.utils, db.listservs
from lxml import etree as et
import mysql.connector as mariadb
import config
logging.basicConfig(level=logging.DEBUG)
def list_all(d, ext):
if not os.path.isdir(d):
logging.error(d + " is not a valid directory.")
return None
return [f for f in glob.glob(os.path.join(d, "*." + ext))]
def index(f, indx=None):
if not os.path.isfile(f):
logging.error(f + " is not a valid file.")
return None
conf = config.listservs_db
db_con = db.utils.connect_db(conf['database'], conf['host'], conf['user'], conf['password'])
if db_con is None:
logging.error("Can not connect to db " + conf['database'] + " @ " + conf['host'])
return None
tables = db.utils.list_all_tables(db_con)
if tables is None:
logging.error("There are no table in db " + conf['database'] + " @ " + conf['host'])
db_con.close()
return None
# filename should be of the type: N.xxxx.xml
#ex: 3.Network.xml
ch = os.path.basename(f).split('.')[0]
if indx is None:
indx = {}
root = et.parse(f).getroot()
to_table_map = {
'<new-media-curating@jiscmail.ac.uk>': 'crumb',
'spectre@mikrolisten.de': 'spectre',
'<empyre@lists.cofa.unsw.edu.au>': 'empyre',
'nettime-bold@nettime.org': 'nettime_bold',
'nettime-l@desk.nl': 'nettime_l',
'nettime-l@desk.nl': 'nettime_l',
'mettime-l-temp@material.net': 'nettime_l',
'nettime-l@bbs.thing.net': 'nettime_l',
'nettime-l@kein.org': 'nettime_l',
'oldboys@lists.ccc.de': 'oldboys',
'n/a': 'syndicate'
}
try:
logging.info("-----------------")
logging.info(os.path.basename(f))
logging.info("-----------------")
for m in root.findall('mails/mail'):
nbr_str = m.find('nbr').text
to_str = m.find('to').text
date_str = m.find('date').text
from_str = m.find('from').text
# format nbr
nbr_str = ch + '.' + nbr_str
if nbr_str in indx:
logging.warning(nbr_str + " is already indexed... skipping")
continue
table = to_table_map[to_str]
logging.info(nbr_str + " - [" + table + "] - " + date_str + " - " + from_str)
# db_con, date_str, from_str, db_str
urls = db.listservs.query_url(db_con, date_str, from_str, table)
if urls is None or len(urls) == 0:
logging.warning("No url for " + nbr_str)
continue
if len(urls) > 1:
logging.warning("More than one url for " + nbr_str + "... taking first...")
indx[nbr_str] = urls[0]
return indx
except Exception as e:
print("aaaaa")
raise e
finally:
db_con.close()
def parse_nbr(nbr_str):
if '-' in nbr_str:
nbr_str = nbr_str.split('-')[0]
return tuple([int(j) for j in nbr_str.split('.')])
def save(fn, ind):
logging.info("savig work")
with open(fn, 'w') as fp:
# sort keys
ind = collections.OrderedDict(sorted(ind.items(), key=lambda x: parse_nbr(x[0])))
json.dump(ind, fp, indent=4, ensure_ascii=False)
logging.info("done.")
if __name__ == '__main__':
p = argparse.ArgumentParser(description='Extract urls for mails in xml file')
p.add_argument('file', metavar="f", help="xml file to extract urls for")
ind = {}
args = p.parse_args()
if args.file == "all":
try:
urls = os.path.join(config.index['path'], config.index['urls'])
with open(urls) as fp:
ind = json.load(fp)
xml_files = list_all(config.xml['path'], 'xml')
for x in xml_files:
if index(x, indx=ind) is None:
logging.error("Error processing - " + x)
save(urls, ind)
except KeyboardInterrupt:
save(urls, ind)
# logging.info("savig work")
# with open(urls, 'w') as fp:
# # sort keys
# ind = collections.OrderedDict(sorted(ind.items(), key=lambda x: tuple([int(j) for j in x[0].split('.')])))
# json.dump(ind, fp, indent=4, ensure_ascii=False)
# logging.info("done.")
else:
ind = index(args.file)
print(json.dumps(ind, indent=4, sort_keys=True, ensure_ascii=False))

View File

@ -31,28 +31,6 @@ def read_index(d, fn):
return index_data return index_data
# def add_selected_kw_index(d, fn, kw):
# fp = os.path.join(d, fn)
# if not os.path.isfile(fp):
# return False
# with open(fp) as f:
# index_data = json.load(f)
# if kw not in index_data['orphan']:
# return False
# v = index_data['orphan'].pop(kw)
# if kw not in index_data['selected']:
# index_data['selected'][kw] = []
# index_data['selected'][kw] += v
# with open(fp, 'w') as fout:
# json.dump(index_data, fout, indent=4, sort_keys=True, ensure_ascii=False)
# return True
def modify_selected_kw_index(d, fn, kw, action="add"): def modify_selected_kw_index(d, fn, kw, action="add"):
fp = os.path.join(d, fn) fp = os.path.join(d, fn)
@ -85,6 +63,15 @@ def modify_selected_kw_index(d, fn, kw, action="add"):
return True return True
def read_index_master(d, fn):
fp = os.path.join(d, fn)
if not os.path.isfile(fp):
return False
with open(fp) as f:
index_data = json.load(f, object_pairs_hook=OrderedDict)
return index_data
@app.route('/index', methods = ['GET']) @app.route('/index', methods = ['GET'])
def index(): def index():
@ -114,6 +101,37 @@ def indexfn(fn):
return "ok" return "ok"
return "-" return "-"
@app.route('/index-master', methods = ['GET', 'POST'])
def indexmaster():
if request.method == 'GET':
data = read_index_master(config.index['path'], config.index['master'])
if data is not None:
return render_template("indx.master.html", fn="INDEX [MASTER]", master=data)
else:
return "File: " + os.path.join(config.index['path'], config.index['master']) + "does not exist."
elif request.method == 'POST':
data = request.form
a = data.get('action')
print(a)
if a == "regex":
logging.info("POST REGEX " + data.get('kw') + " ++ " + data.get('reg'))
reg = json.loads(data.get('reg').replace("'", ""))
print(type(data.get('reg')))
return "POST REGEX " + data.get('kw') + " ++ " + data.get('reg')
# if modify_selected_kw_index(config.index['path'], fn, data.get('kw')):
# return "ok"
elif a == "collate":
logging.info("POST COLLATE " + data.get('kw') + " ++ " + data.get('col'))
return "POST COLLATE " + data.get('kw') + " ++ " + data.get('col')
# if modify_selected_kw_index(config.index['path'], fn, data.get('kw'), action="delete"):
# return "ok"
elif a == "delete":
logging.info("POST DELETE " + data.get('kw'))
return "POST DELETE " + data.get('kw')
# if modify_selected_kw_index(config.index['path'], fn, data.get('kw'), action="delete"):
# return "ok"
return "-"
''' '''
XML XML

12
www/static/indx.master.js Normal file
View File

@ -0,0 +1,12 @@
$(document).ready(function(){
$('.delete, .regex, .collate').click(function(e) {
var li = $(this).parent("li");
var reg = li.children(".regex_input")[0].value;
var col = li.children(".collate_input")[0].value;
$.post('/index-master', {'action': $(this).attr('class'), 'kw': li.data("kw"), 'reg': reg, 'col': col}, function(d) {
if(d === 'ok') {
location.reload();
}
});
});
});

View File

@ -0,0 +1,28 @@
<html>
<head>
<meta charset="utf-8">
<title>{{fn}}</title>
<script type="text/javascript" src="{{ url_for('static',filename='jquery-3.2.1.min.js') }}" charset="utf-8"></script>
<script type="text/javascript" src="{{ url_for('static',filename='indx.master.js') }}"></script>
</head>
<body>
<h1>{{fn}}</h1>
<div id="all">
<h2>Selected</h2>
<ul>
{% for kw, s in master.items() %}
<li data-kw="{{kw}}" data-list="master">{{kw}} - <input type="text" class="regex_input" value="{{s.regex}}"> <button class="regex">+</button> - <input type="text" class="collate_input" value=""> <button class="collate">+</button> - <button class="delete">-</button>
<ul>
{% for i in s.indx %}
<li>{{i}}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
<hr>
<hr>
<hr>
</div>
</body>
</html>

View File

@ -5738,7 +5738,7 @@ Ted
</content> </content>
</mail> </mail>
<mail> <mail>
<nbr>25.2</nbr> <nbr>25.3</nbr>
<subject>Re: &lt;nettime&gt; The Piran Nettime Manifesto</subject> <subject>Re: &lt;nettime&gt; The Piran Nettime Manifesto</subject>
<from>Mark Stahlman (via RadioMail)</from> <from>Mark Stahlman (via RadioMail)</from>
<to>nettime-l@desk.nl</to> <to>nettime-l@desk.nl</to>

View File

@ -84,7 +84,7 @@ anywhere in the world.
</content> </content>
</mail> </mail>
<mail> <mail>
<nbr>1.0</nbr> <nbr>0.1</nbr>
<subject>&lt;nettime&gt; Re: Concerned about terrorism in Kosovo</subject> <subject>&lt;nettime&gt; Re: Concerned about terrorism in Kosovo</subject>
<from>Aleksandar &amp; Branka Davic</from> <from>Aleksandar &amp; Branka Davic</from>
<to>nettime-l@desk.nl</to> <to>nettime-l@desk.nl</to>
@ -135,6 +135,89 @@ albanians, as well as jews, hungarians, romanian, slowaks, roma, croats,
russians, bulgarians.. . i wonder what they would have to say to your russians, bulgarians.. . i wonder what they would have to say to your
letter... letter...
---
# distributed via nettime-l : no commercial use without permission
# &lt;nettime&gt; is a closed moderated mailinglist for net criticism,
# collaborative text filtering and cultural politics of the nets
# more info: majordomo {AT} icf.de and "info nettime" in the msg body
# URL: http://www.desk.nl/~nettime/ contact: nettime-owner {AT} icf.de
</content>
</mail>
<mail>
<nbr>0.2</nbr>
<subject>Re: &lt;nettime&gt; Re: Concerned about terrorism in Kosovo</subject>
<from>rvdbri</from>
<to>nettime-l@desk.nl</to>
<date>Wed, 04 Mar 1998 10:45:33 +0100</date>
<content>
Aart wrote:
&gt;OK Richard van den Brink,
&gt;
&gt;I've seen and read the report by Albanian secessionist magazine (all
&gt;articles unsigned) which You have recommended to me.
&gt;Well, first those photos. What do You think that Serbian four policemen
&gt;who were killed by Kosova Liberation Army looked less massacred than
&gt;these Albanians on photos?
No reason trying to outbid with other pictures or facts. What is
disquieting me is that the nettime list is used for an outspoken political
point of (Servian) view on the conflict in Kosovo. For me it's ok that this
kind of opinions are existing, but I don't need to read those on a list as
nettime. In the same way I wouldn't propagandize to read information on
certain sites I was recommending as a kind of counter balance.
It would be possible to start a discussion about the Kosovo conflict here,
but I don't think its the propper place. Therefore I suggest - if I am
right - to modorate the list in a better way.
Richard
---
# distributed via nettime-l : no commercial use without permission
# &lt;nettime&gt; is a closed moderated mailinglist for net criticism,
# collaborative text filtering and cultural politics of the nets
# more info: majordomo {AT} icf.de and "info nettime" in the msg body
# URL: http://www.desk.nl/~nettime/ contact: nettime-owner {AT} icf.de
</content>
</mail>
<mail>
<nbr>0.3</nbr>
<subject>&lt;nettime&gt; Re: Concerned about terrorism in Kosovo</subject>
<from>antiorp</from>
<to>nettime-l@desk.nl</to>
<date>Sun, 8 Mar 1998 05:54:02 -0600</date>
<content>
&gt;We in Yugoslavia are very concerned about the increasing of terrorist
serb!an akt!v!t!ez.
http://www.god-emil.dk/=cw4t7abs/0f0003/produkter/film+video.html
kl!k 0
am -3r! kk a 5 u g3 r _||-
&gt; Serb military and paramilitary forces attacked today 14 villages in Kosove.
&gt; 95++ d ea d.
www.albanian.com
www.koha.net
www.dardania.com
www.kosova.de
--- ---
# distributed via nettime-l : no commercial use without permission # distributed via nettime-l : no commercial use without permission
# &lt;nettime&gt; is a closed moderated mailinglist for net criticism, # &lt;nettime&gt; is a closed moderated mailinglist for net criticism,
@ -267,89 +350,6 @@ doesn't mention that.For some reason the README doesn't mention that.For
some reason the README doesn't mention that. some reason the README doesn't mention that.
</content>
</mail>
<mail>
<nbr>1.1</nbr>
<subject>Re: &lt;nettime&gt; Re: Concerned about terrorism in Kosovo</subject>
<from>rvdbri</from>
<to>nettime-l@desk.nl</to>
<date>Wed, 04 Mar 1998 10:45:33 +0100</date>
<content>
Aart wrote:
&gt;OK Richard van den Brink,
&gt;
&gt;I've seen and read the report by Albanian secessionist magazine (all
&gt;articles unsigned) which You have recommended to me.
&gt;Well, first those photos. What do You think that Serbian four policemen
&gt;who were killed by Kosova Liberation Army looked less massacred than
&gt;these Albanians on photos?
No reason trying to outbid with other pictures or facts. What is
disquieting me is that the nettime list is used for an outspoken political
point of (Servian) view on the conflict in Kosovo. For me it's ok that this
kind of opinions are existing, but I don't need to read those on a list as
nettime. In the same way I wouldn't propagandize to read information on
certain sites I was recommending as a kind of counter balance.
It would be possible to start a discussion about the Kosovo conflict here,
but I don't think its the propper place. Therefore I suggest - if I am
right - to modorate the list in a better way.
Richard
---
# distributed via nettime-l : no commercial use without permission
# &lt;nettime&gt; is a closed moderated mailinglist for net criticism,
# collaborative text filtering and cultural politics of the nets
# more info: majordomo {AT} icf.de and "info nettime" in the msg body
# URL: http://www.desk.nl/~nettime/ contact: nettime-owner {AT} icf.de
</content>
</mail>
<mail>
<nbr>1.2</nbr>
<subject>&lt;nettime&gt; Re: Concerned about terrorism in Kosovo</subject>
<from>antiorp</from>
<to>nettime-l@desk.nl</to>
<date>Sun, 8 Mar 1998 05:54:02 -0600</date>
<content>
&gt;We in Yugoslavia are very concerned about the increasing of terrorist
serb!an akt!v!t!ez.
http://www.god-emil.dk/=cw4t7abs/0f0003/produkter/film+video.html
kl!k 0
am -3r! kk a 5 u g3 r _||-
&gt; Serb military and paramilitary forces attacked today 14 villages in Kosove.
&gt; 95++ d ea d.
www.albanian.com
www.koha.net
www.dardania.com
www.kosova.de
---
# distributed via nettime-l : no commercial use without permission
# &lt;nettime&gt; is a closed moderated mailinglist for net criticism,
# collaborative text filtering and cultural politics of the nets
# more info: majordomo {AT} icf.de and "info nettime" in the msg body
# URL: http://www.desk.nl/~nettime/ contact: nettime-owner {AT} icf.de
</content> </content>
</mail> </mail>
<mail> <mail>
@ -4849,7 +4849,7 @@ disciplines the m&#248;del of civilization.
</content> </content>
</mail> </mail>
<mail> <mail>
<nbr>25.0</nbr> <nbr>24.1</nbr>
<subject>&lt;nettime&gt; Sender: owner-nettime-l {AT} bbs.thing.n</subject> <subject>&lt;nettime&gt; Sender: owner-nettime-l {AT} bbs.thing.n</subject>
<from>integer</from> <from>integer</from>
<to>nettime-l@bbs.thing.net</to> <to>nettime-l@bbs.thing.net</to>
@ -5377,7 +5377,7 @@ Netochka Nezvanova
</content> </content>
</mail> </mail>
<mail> <mail>
<nbr>27.0</nbr> <nbr>26.1</nbr>
<subject>&lt;nettime&gt; [ot] [!nt] \n2+0\</subject> <subject>&lt;nettime&gt; [ot] [!nt] \n2+0\</subject>
<from>integer</from> <from>integer</from>
<to>nettime-l@bbs.thing.net</to> <to>nettime-l@bbs.thing.net</to>

View File

@ -531,7 +531,7 @@ ana</content>
&gt; SPECTRE list for media culture in All Europe</content> &gt; SPECTRE list for media culture in All Europe</content>
</mail> </mail>
<mail> <mail>
<nbr>3.5</nbr> <nbr>3.5-p.114-2</nbr>
<subject>[spectre] Deep Europe</subject> <subject>[spectre] Deep Europe</subject>
<from>Bruce Sterling</from> <from>Bruce Sterling</from>
<to>spectre@mikrolisten.de</to> <to>spectre@mikrolisten.de</to>

View File

@ -1808,7 +1808,7 @@ Molly</content>
Please do!</content> Please do!</content>
</mail> </mail>
<mail> <mail>
<nbr>4.3</nbr> <nbr>4.3-p.138-2</nbr>
<subject>Re: &lt;nettime&gt; limits of networks...</subject> <subject>Re: &lt;nettime&gt; limits of networks...</subject>
<from>David Garcia</from> <from>David Garcia</from>
<to>nettime-l@kein.org</to> <to>nettime-l@kein.org</to>
@ -4373,7 +4373,7 @@ that.
hey hauffeur step on the gas &amp; run over the frog</content> hey hauffeur step on the gas &amp; run over the frog</content>
</mail> </mail>
<mail> <mail>
<nbr>7.12</nbr> <nbr>7.12-p.155-2</nbr>
<subject>Re: &lt;nettime&gt; Network, Swarm, Microstructur</subject> <subject>Re: &lt;nettime&gt; Network, Swarm, Microstructur</subject>
<from>martha rosler</from> <from>martha rosler</from>
<to>nettime-l@bbs.thing.net</to> <to>nettime-l@bbs.thing.net</to>

View File

@ -9604,52 +9604,6 @@ Trace projects http://trace.ntu.ac.uk/writers/sondheim/index.htm
partial mirror at http://www.anu.edu.au/english/internet_txt</content> partial mirror at http://www.anu.edu.au/english/internet_txt</content>
</mail> </mail>
<mail> <mail>
<nbr>24.0-p.471</nbr>
<subject>&lt;nettime&gt; what is going on, on nettime?</subject>
<from>geert</from>
<to>nettime-l@bbs.thing.net</to>
<date>Tue, 17 Aug 2004 11:14:50 +0000</date>
<content>
Well... Alan, nettime being closed off because of lacking nn postings. Many
will find a relief that such postings and related debates no longer happen, but
that's perhaps a personal matter.
What might be true is the shift towards political economy, away from arts and
culture.
The political economy (of new media) thread has been part of nettime from day
one, at least in my understanding. And I am not sure that one can find these
debate anywhere.
It could be the case that the international nettime list lack a common spirit
and direction. Is that what you mean?
The question could be: what moves people these days? I think that's a more
interesting--and urgent--question than the old issue of 'censoring' nn or mez.
Yours,
Geert
From: Alan Sondheim &lt;sondheim {AT} panix.com&gt;
To: soft_skinned_space &lt;empyre {AT} lists.cofa.unsw.edu.au&gt;
Subject: [-empyre-] what is going on, on nettime? (fwd)
Date: Sat, 14 Aug 2004 22:20:22 -0400
nettime-l seems increasingly closed off; numerous voices aren't
heard any more, for example nn, mez, Talan - I wrote them asking
why the list is turning from cultural politics to more or less
straight political economy, which can be found anywhere - the
post was censored. Florian Cramer just stopped the Unstable
Digest - there's no more codework there at all - he left his
co-editors more or less in the lurch, not answering email, then
disappearing, now back on nettime with politics. So that venue's
gone and apparently at this point one can't even question the
list direction onlist.
&lt;...&gt;</content>
</mail>
<mail>
<nbr>25.0</nbr> <nbr>25.0</nbr>
<subject>&lt;nettime&gt; Re: on moderation and spams (several messages)</subject> <subject>&lt;nettime&gt; Re: on moderation and spams (several messages)</subject>
<from>nettime's_digestive_system</from> <from>nettime's_digestive_system</from>