diff --git a/build.properties b/build.properties index 072c18af3..df24c3c9f 100644 --- a/build.properties +++ b/build.properties @@ -3,11 +3,11 @@ javacSource=1.4 javacTarget=1.4 # Release Configuration -releaseVersion=0.41 -#releaseFile=yacy_dev_v${releaseVersion}_${DSTAMP}_${releaseNr}.tar.gz -releaseFile=yacy_v${releaseVersion}_${DSTAMP}_${releaseNr}.tar.gz -#releaseDir=yacy_dev_v${releaseVersion}_${DSTAMP}_${releaseNr} -releaseDir=yacy_v${releaseVersion}_${DSTAMP}_${releaseNr} +releaseVersion=0.411 +releaseFile=yacy_dev_v${releaseVersion}_${DSTAMP}_${releaseNr}.tar.gz +#releaseFile=yacy_v${releaseVersion}_${DSTAMP}_${releaseNr}.tar.gz +releaseDir=yacy_dev_v${releaseVersion}_${DSTAMP}_${releaseNr} +#releaseDir=yacy_v${releaseVersion}_${DSTAMP}_${releaseNr} releaseNr=$Revision$ # defining some file/directory access rights diff --git a/htroot/Network.html b/htroot/Network.html index ee9336475..a85f6faa5 100644 --- a/htroot/Network.html +++ b/htroot/Network.html @@ -167,6 +167,7 @@ YaCy Cluster Indexing Speed: #[gppm]# Pages Per Minute (Accumulated PPM over Act

+

#(comment)# :: @@ -195,6 +196,7 @@ To do this, press this button:

#(/comment)#

+
diff --git a/htroot/NetworkPicture.java b/htroot/NetworkPicture.java new file mode 100644 index 000000000..da7a0a2ee --- /dev/null +++ b/htroot/NetworkPicture.java @@ -0,0 +1,124 @@ +// NetworkPicture.java +// ----------------------- +// part of YaCy +// (C) by Michael Peter Christen; mc@anomic.de +// first published on http://www.anomic.de +// Frankfurt, Germany, 2005 +// Created 08.10.2005 +// +// $LastChangedDate: 2005-09-29 02:24:09 +0200 (Thu, 29 Sep 2005) $ +// $LastChangedRevision: 811 $ +// $LastChangedBy: orbiter $ +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Using this software in any meaning (reading, learning, copying, compiling, +// running) means that you agree that the Author(s) is (are) not responsible +// for cost, loss of data or any harm that may be caused directly or indirectly +// by usage of this softare or this documentation. The usage of this software +// is on your own risk. The installation and usage (starting/running) of this +// software may allow other people or application to access your computer and +// any attached devices and is highly dependent on the configuration of the +// software which must be done by the user of the software; the author(s) is +// (are) also not responsible for proper configuration and usage of the +// software, even if provoked by documentation provided together with +// the software. +// +// Any changes to this file according to the GPL as documented in the file +// gpl.txt aside this file in the shipment you received can be done to the +// lines that follows this copyright notice here, but changes must not be +// done inside the copyright notive above. A re-distribution must contain +// the intact and unchanged copyright notice. +// Contributions and changes to the program code must be marked as such. + + +import java.awt.image.BufferedImage; +import java.util.Enumeration; + +import de.anomic.http.httpHeader; +import de.anomic.server.serverObjects; +import de.anomic.server.serverSwitch; +import de.anomic.tools.ImagePainter; + +import de.anomic.yacy.yacyCore; +import de.anomic.yacy.yacySeed; + +// draw a picture of the yacy network + +public class NetworkPicture { + + private static final int width = 640; + private static final int height = 420; + private static final int radius = Math.min(width, height) / 5; + + public static BufferedImage respond(httpHeader header, serverObjects post, serverSwitch env) { + + ImagePainter img = new ImagePainter(width, height, ImagePainter.TRANSPARENT); + img.setMode(ImagePainter.MODE_ADD); + + if (yacyCore.seedDB == null) return img.toImage(true); // no other peers known + int size = yacyCore.seedDB.sizeConnected(); + if (size == 0) return img.toImage(true); // no other peers known + + // draw network circle + img.setColor("004020"); + img.arc(width / 2, height / 2, radius - 20, radius + 20, 0, 360); + + + final int maxCount = 300; + yacySeed seed; + int count = 0; + int angle; + img.setColor(ImagePainter.ADDITIVE_BLACK); + //System.out.println("Seed Maximum distance is " + yacySeed.maxDHTDistance); + //System.out.println("Seed Minimum distance is " + yacySeed.minDHTNumber); + Enumeration e = yacyCore.seedDB.seedsConnected(true, false, null); + while (e.hasMoreElements() && count < maxCount) { + seed = (yacySeed) e.nextElement(); + if (seed != null) { + drawPeer(img, width / 2, height / 2, radius, seed, "000040", "A0A0A0"); + count++; + } + } + count = 0; + e = yacyCore.seedDB.seedsPotential(true, false, null); + long lastseen; + while (e.hasMoreElements() && count < maxCount) { + seed = (yacySeed) e.nextElement(); + if (seed != null) { + lastseen = Math.abs((System.currentTimeMillis() - seed.getLastSeenTime()) / 1000 / 60); + if (lastseen < 60) drawPeer(img, width / 2, height / 2, radius, seed, "100010", "606060"); + count++; + } + } + drawPeer(img, width / 2, height / 2, radius, yacyCore.seedDB.mySeed, "800000", "D0D0D0"); + return img.toImage(true); + + } + + private static void drawPeer(ImagePainter img, int x, int y, int radius, yacySeed seed, String colorDot, String colorText) { + int angle = (int) ((long) 360 * (seed.dhtDistance() / (yacySeed.maxDHTDistance / (long) 10000)) / (long) 10000); + //System.out.println("Seed " + seed.hash + " has distance " + seed.dhtDistance() + ", angle = " + angle); + int linelength = radius + 60 + (seed.hash.hashCode() % (radius / 2)); + int dotsize = 6 + 2 * (int) (seed.getLinkCount() / 500000L); + if (dotsize > 18) dotsize = 18; + img.setColor(colorDot); + img.arcDot(x, y, radius, dotsize, angle); + img.setColor(colorText); + img.arcLine(x, y, radius + 18, linelength, angle); + img.arcPrint(x, y, linelength, angle, seed.getName().toUpperCase()); + } + +} diff --git a/source/de/anomic/tools/ImagePainter.java b/source/de/anomic/tools/ImagePainter.java index 7ba7b8924..eb469ca8c 100644 --- a/source/de/anomic/tools/ImagePainter.java +++ b/source/de/anomic/tools/ImagePainter.java @@ -48,6 +48,10 @@ package de.anomic.tools; import java.awt.Graphics2D; +import java.awt.GraphicsEnvironment; +import java.awt.GraphicsDevice; +import java.awt.GraphicsConfiguration; +import java.awt.Transparency; import java.awt.Color; import java.awt.image.BufferedImage; import java.awt.image.WritableRaster; @@ -326,14 +330,26 @@ public class ImagePainter { } public void arcLine(int cx, int cy, int innerRadius, int outerRadius, int angle) { - int xi = cx + (int) ((innerRadius + 1) * Math.cos(Math.PI * angle / 180)); - int yi = cy - (int) ((innerRadius + 1) * Math.sin(Math.PI * angle / 180)); - int xo = cx + (int) ((outerRadius + 1) * Math.cos(Math.PI * angle / 180)); - int yo = cy - (int) ((outerRadius + 1) * Math.sin(Math.PI * angle / 180)); + int xi = cx + (int) (innerRadius * Math.cos(Math.PI * angle / 180)); + int yi = cy - (int) (innerRadius * Math.sin(Math.PI * angle / 180)); + int xo = cx + (int) (outerRadius * Math.cos(Math.PI * angle / 180)); + int yo = cy - (int) (outerRadius * Math.sin(Math.PI * angle / 180)); line(xi, yi, xo, yo); } + public void arcDot(int cx, int cy, int arcRadius, int dotRadius, int angle) { + int x = cx + (int) (arcRadius * Math.cos(Math.PI * angle / 180)); + int y = cy - (int) (arcRadius * Math.sin(Math.PI * angle / 180)); + dot(x, y, dotRadius, true); + } + public BufferedImage toImage(boolean complementary) { + /* + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice gs = ge.getDefaultScreenDevice(); + GraphicsConfiguration gc = gs.getDefaultConfiguration(); + BufferedImage bi = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT); + */ BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D gr = bi.createGraphics(); gr.setBackground(Color.white); diff --git a/source/de/anomic/yacy/yacySeed.java b/source/de/anomic/yacy/yacySeed.java index d202f4e67..5a3445e03 100644 --- a/source/de/anomic/yacy/yacySeed.java +++ b/source/de/anomic/yacy/yacySeed.java @@ -270,6 +270,14 @@ public class yacySeed { } } + public long getLinkCount() { + try { + return Long.parseLong(get("LCount", "0")); + } catch (NumberFormatException e) { + return 0; + } + } + private boolean getFlag(int flag) { String flags = get("Flags", "0000"); return (new bitfield(flags.getBytes())).get(flag); @@ -321,26 +329,34 @@ public class yacySeed { c = c / 96; } if (length != 0 && s.length() > length) - throw new RuntimeException("encodeLex result '" + s + "' exceeds demanded length of " + length + " digits"); + throw new RuntimeException("encodeLex result '" + s + "' exceeds demanded length of " + length + " digits"); if (length == 0) length = 1; // rare exception for the case that c == 0 while (s.length() < length) s = '-' + s; return s; } public long decodeLex(String s) { - long c = 0; - for (int i = 0; i < s.length(); i++) c = c * 96 + (byte) s.charAt(i) - 32; - return c; + long c = 0; + for (int i = 0; i < s.length(); i++) c = c * 96 + (byte) s.charAt(i) - 32; + return c; } private static long maxLex(int len) { // computes the maximum number that can be coded with a lex-encoded String of length len long c = 0; - for (int i = 0; i < len; i++) c = c * 96 + 95; - return c; + for (int i = 0; i < len; i++) c = c * 96 + 90; + return c; + } + + private static long minLex(int len) { + // computes the minimum number that can be coded with a lex-encoded String of length len + long c = 0; + for (int i = 0; i < len; i++) c = c * 96 + 13; + return c; } - public static final long maxDHTDistance = maxLex(9); + public static final long minDHTNumber = minLex(9); + public static final long maxDHTDistance = maxLex(9) - minDHTNumber; public long dhtDistance(String wordhash) { // computes a virtual distance, the result must be set in relation to maxDHTDistace @@ -351,6 +367,11 @@ public class yacySeed { return (myPos > wordPos) ? (myPos - wordPos) : (myPos + maxDHTDistance - wordPos); } + public long dhtDistance() { + // returns an absolute value + return decodeLex(hash.substring(0,9)) - minDHTNumber; + } + public static yacySeed genLocalSeed(plasmaSwitchboard sb) { // genera a seed for the local peer // this is the birthplace of a seed, that then will start to travel to other peers