Pokazywanie postów oznaczonych etykietą tools. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą tools. Pokaż wszystkie posty
czwartek, lutego 22, 2018
piątek, lutego 06, 2015
Aerospike - fast or safe?
Let's look at https://github.com/aerospike/aerospike-server/blob/180ed47a5fffc54b3e45faccb33c908bc189db2e/as/src/storage/drv_ssd.c and try to find open() system call and fsync() system call. We see that open flags like O_SYNC are parametrized. There is also loop for fsync with parametrized sleep time. Relevant configuration (https://github.com/aerospike/aerospike-server/blob/master/as/src/base/cfg.c) lives in enable-osync and fsync-max-sec. Now, check default values at http://www.aerospike.com/docs/reference/configuration/. We see that synchronous writes are disabled by default, and fsync is also disabled. This means that there are no safety guaranties for single Aerospike node (see also: flush-max-ms). Due to asd/OS/storage crash data will likely be lost or corrupted. Probabilistic situation for 3 nodes on different racks with battery backed SSD array is quite different and the combined risk is very small (if we do not consider whole datacenter crash) and therefore Aerospike is acceptable solution with standard sane data safety/integrity/availability criteria.
wtorek, października 20, 2009
Ultimate HTTP Tunnel
Sprytna aplikacja, którą każdy chciał mieć od dawna. Cytat ze źródeł:/* Ultimate HTTP TunnelMożna przepuścić przez tunel HTTP dowolny protokół, [l] udaje Internet Explorera, a [r] udaje Apache'a.
*
* c - client
* l - local server
* r - remote server
* d - destination
*
* | |
* | |
* [c] <---> bytes <--> [l] <---> HTTP with XML <--->[r] ---> bytes ---> [d]
* | |
* | |
*
* [c] doesn't have access to [d] port
* [l] have access to [r] port and [r] have access to [d] port
* [l] and [r] create HTTP Tunnel for [c] to access [d]
*/
czwartek, sierpnia 20, 2009
DbDiff na replice read-only
Założenie: z produkcyjnej bazy danych online generowana jest codziennie replika read-only. Chcemy w jakiś sposób generować różnice pomiędzy stanem z dnia obecnego a stanem z dnia poprzedniego. Tabelki zawierają od kilkuset tysięcy do paru milionów rekordów. Projekt nie jest priorytetowy i nie chcemy na niego wydawać pieniędzy.Rozwiązanie: Tworzymy bazę przejściową z tabelkami CURRENT_* i PREVIOUS_*. Na początku transakcyjnej operacji kopiujemy wszystkie CURRENT_* do PREVIOUS_*, potem ładujemy aktualny stan bazy read-only do CURRENT_* i liczymy różnicę (select minus select). Baza przejściowa ma do dyspozycji 1500MB pamięci, program do generowania różnicy 768MB.
Warunki brzegowe: Tabelki źródłowe po zserializowaniu do plików mają > 300MB. Dell + Intel Core 2 Quad 2.4 GHz + 3GB RAM + NT5.
Wyniki:
Czas operacji na bazie:
Apache Derby: 31 minut (bez select into table)
Oracle XE: 12 minut (20 minut bez create table as select)
MSSQL 2005 Express: 16 minut (24 min bez select into from).
PostgreSQL: nie da się (transakcje nie działają tak jak trzeba)
MySQL: nie da się (brak operatora minus/except)
środa, sierpnia 12, 2009
Jak wyjąć zaszyfrowane hasła z konfiguracji WebLogic'a
new weblogic.security.internal.encryption.ClearOrEncryptedService(
SerializedSystemIni.getEncryptionService(
"/home/weblogic/bea/domains/wls0"
)
).decrypt("{3DES}1234abcd==");
piątek, czerwca 12, 2009
LicensedCpus.c
Program dedykowany wszystkim dyrektorom IT, którzy nie wiedzą, że software licencjonowany na 2 CPU można uruchamiać na serwerze z 4 CPU.#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <errno.h>
#include <string.h>
int get_num_cpus() {
int cnt = 0;
char *line = NULL;
size_t len = 0;
FILE *fp = fopen("/proc/stat", "r");
if (fp!=NULL) {
while (getline(&line, &len, fp)!=-1) {
if (line!=NULL && strstr(line, "cpu")!=NULL)
cnt++;
}
if (line)
free(line);
fclose(fp);
cnt--;
}
return cnt;
}
int main(int argc, char** argv) {
static cpu_set_t mask;
int user_mask, i=0, max, m=0;
if (argc<3) {
fprintf(stdout, "Usage: %s cpu_mask(int) command(full_path)\n",argv[0]);
exit(0);
}
user_mask = atoi(argv[1]);
max = 1 << (get_num_cpus()-1);
CPU_ZERO(&mask);
for (i=0; i<max; i++) {
if ( (user_mask & (1 << i)) == (1 << i)) {
CPU_SET(i, &mask);
m |= (1<<i);
}
}
if (sched_setaffinity(0, sizeof(mask), &mask)==0) {
fprintf(stdout, "Running %s with mask %d, cpus=%d\n", argv[2], m, max);
return execv(argv[2], argv+2);
}
else {
fprintf(stderr, "Cannot set cpu mask: %s. Effective mask was %d\n", strerror(errno), m);
exit(1);
}
}
piątek, maja 15, 2009
java.sql.ResultSet over DOM
Taki wrapper pozwala zachować stary kod operujący tylko na strukturach bazodanowych (rs.getInt...) i jako źródła danych używać obiektów zserializowanych do XML-a.
Node g = DOMHelper.getElementsByTag(p, "group-list").get(0);
rs = new DOMResultSet(g);
while (rs.next()) { // iteracja po węzłach poniżej group-list
// obiekt z wezła group
Group g = Group.fromResultSet(rs);
// w group wskazujemy węzły group-attrib
if (rs.findColumn("group-attrib")>0) {
while (rs.next()) {
GroupAttrib ga = GroupAttrib.fromResultSet(rs, g);
}
rs.refreshRow(); // kasujemy wskazanie
}
Debug.println("Wczytano "+rs.getString("."),this);
// "." oznacza biężący węzeł do zwrócenia jako string XML
}
czwartek, czerwca 26, 2008
Proste serializowanie obiektu do XML-a
private static StringBuffer describeNodeMark(StringBuffer sb, Object o, String name, int level, boolean end) {for (int i = 0; i < level-1; i++)
sb.append("\t");
sb.append(end ? "</" : "<").append( name ).append(">\r\n");
return sb;
}
private static StringBuffer describeNode(StringBuffer sb, Object o, String name, int level) throws Exception {
if (o==null) {
for (int i = 0; i < level; i++)
sb.append("\t");
sb.append("<").append( name ).append("/>\r\n");
return sb;
}
else if (o.getClass().getName().startsWith("[B")) {
sb.append("<byte[]>").append( new String( (byte[]) o) ).append("</byte[]>");
return sb;
}
else if (o.getClass().getName().startsWith("[C")) {
char[] cs = (char[])o;
for (int i=0; i<cs.length; i++) {
Character c = (Character)cs[i];
sb.append(c);
//toXmlString(sb, c, level);
}
return sb;
}
else {
for (int i = 0; i < level; i++)
sb.append("\t");
sb.append("<").append(name).append(">");
sb.append(o);
sb.append("</").append(name).append(">\r\n");
return sb;
}
}
@SuppressWarnings("unchecked")
public final static StringBuffer toXmlString(StringBuffer sb, Object o, int level) throws Exception {
if (sb==null)
sb = new StringBuffer();
level++;
if (o!=null) {
String nm = o.getClass().getName();
if (nm.contains("org.apache.axis") || nm.endsWith(";")) // skip axis TypeDef and list terminator
return sb;
}
File f = new File( o.getClass().getName().replaceAll("\\.", "/") );
if (o==null) {
return describeNode(sb, o, f.getName(), level);
}
if ((o.getClass().getName().startsWith("java.lang") || // basic Java types
o.getClass().getName().startsWith("java.math") ||
o.getClass().getName().startsWith("[B") ||
o.getClass().getName().startsWith("[C")) &&
( !o.getClass().getName().startsWith("java.lang.String")) &&
!o.getClass().getName().startsWith("java.lang.Character")
)
{
return describeNode(sb, o, f.getName(), level);
}
/////////////////////
describeNodeMark(sb, o, f.getName(), level, false);
for (Field fld : o.getClass().getDeclaredFields()) {
fld.setAccessible(true);
String name = fld.getName();
Object obj = fld.get(o);
if (!name.startsWith("__")) { // skip axis fields
if (obj==null) {
describeNode(sb, obj, name, level);
}
else {
String cname = obj.getClass().getName();
if (cname.startsWith("[L")) {
Object[] objs = (Object[]) obj;
for (Object oo : objs) {
if (oo!=null)
sb.append( toXmlString(null, oo, level) );
}
}
if (cname.startsWith("java.lang.Class"))
return sb;
if (cname.startsWith("java.lang") || cname.startsWith("java.math")) {
describeNode(sb, obj, name, level);
}
else {
if (cname.startsWith("java.util.LinkedList$Entry")) {
List list = (List)o;
for (int i = 0; i < list.size(); i++)
sb.append( toXmlString(null, list.get(i), level-1 ) );
}
else if (cname.startsWith("java.util.TreeMap$Entry")){
Map map = (TreeMap) o;
for (Object k : map.keySet()) {
sb.append( toXmlString(null, k, level-1 ) );
}
}
else {
sb.append( toXmlString(null, obj, level) );
}
}
}
}
}
for (int i = 0; i < level-1; i++)
sb.append("\t");
sb.append("</").append( f.getName() ).append(">\r\n");
return sb;
}
Yet Another Logging Utility
package com.company.util.debug;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* Modul logowania
*
*/
public class Debug {
public final static int TRACE_DEPTH = 25;
public final static boolean LOG_INFO = true;
public final static boolean LOG_ERR = true;
public final static String THIS_PACKAGE = "com.company";
public final static int TRACE_DEPTH = 25;
public final static boolean LOG_INFO = true;
public final static boolean LOG_ERR = true;
@SuppressWarnings("unchecked")
public final static void println(String txt, Object thiz) {
if (LOG_INFO) {
Exception e = new Exception();
StringBuffer msg = new StringBuffer();
msg.append("[").append(new Date()).append("] [Caller: ");
if (thiz instanceof Class)
msg.append( ((Class)thiz).getName() ).append("@static=");
else
msg.append( thiz.getClass().getName() ).append("@");
msg.append( thiz.hashCode() ).append("]");
msg.append(" th").append(Thread.currentThread().getId());
String thName = Thread.currentThread().getName();
if (thName!=null)
msg.append("=").append(thName);
msg.append("\r\n\tat ").append(e.getStackTrace()[1]);
msg.append("\r\n\tINFO: ").append(txt).append("\r\n");
System.out.println(msg);
}
}
public final static StringBuffer describeException(StringBuffer msg, Throwable err) {
msg.append("\r\n\tERR: ").append(err.toString()).append("\r\n");
StackTraceElement[] st = err.getStackTrace();
int n = (st!=null) ? Math.min(st.length, TRACE_DEPTH) : 0;
String prev = "";
for (int i=0; i < sti =" st[i]+"> ").append(st[i]);
else
msg.append("\r\n\t").append(st[i]);
prev = sti;
}
if (n>0)
msg.append("\r\n");
return msg;
}
@SuppressWarnings("unchecked")
public final static void printlnErr(String txt, Throwable ex, Object thiz) {
if (LOG_ERR) {
Exception e = new Exception();
StringBuffer msg = new StringBuffer();
msg.append("[").append(new Date()).append("] [Caller: ");
if (thiz instanceof Class)
msg.append( ((Class)thiz).getName() ).append("@static=");
else
msg.append( thiz.getClass().getName() ).append("@");
msg.append( thiz.hashCode() ).append("]");
msg.append("\r\n\tat ").append(e.getStackTrace()[1]);
msg.append("\r\n\tERR: ").append(txt);
Throwable t = ex;
while (t!=null) {
describeException(msg, t);
t = t.getCause();
}
System.out.println(msg);
}
}
@SuppressWarnings("unchecked")
public final static String describeErr(String txt, Throwable ex, Object thiz) {
if (LOG_ERR) {
Exception e = new Exception();
StringBuffer msg = new StringBuffer();
msg.append("[").append(new Date()).append("] [Caller: ");
if (thiz instanceof Class)
msg.append( ((Class)thiz).getName() ).append("@static=");
else
msg.append( thiz.getClass().getName() ).append("@");
msg.append( thiz.hashCode() ).append("]");
msg.append("\r\n\tat ").append(e.getStackTrace()[1]);
msg.append("\r\n\tERR: ").append(txt);
Throwable t = ex;
while (t!=null) {
describeException(msg, t);
t = t.getCause();
}
return msg.toString();
}
return ex.getLocalizedMessage();
}
}
środa, kwietnia 23, 2008
Jednokierunkowa funkcja skrótu w T-SQL
declare @login varchar(20)declare @pass varchar(20)
declare @i int
declare @j int
declare @k int
declare @seed1 int
declare @seed2 int
declare @s varchar(MAX)
declare @t varchar(MAX)
set @seed1 = 0x75ef9d
set @seed2 = 15371
set @login = 'xyz1'
set @pass = 'haslo'
set @t = ''
set @i = 1
set @k = 1
while @i < LEN(@pass)+LEN(@login)
begin
set @j = ASCII( substring(@pass, @i%LEN(@pass)+1, 1) )
set @k = ASCII( substring(@login, @i%LEN(@login)+1, 1) )
set @j = @j ^ @i ^ @k ^ LEN(@pass) ^ @seed1
set @seed1 = (@seed1 + @j) % @seed2
set @i = @i + 1
end
set @i = 1
while @i <= 20
begin
set @j = ASCII( substring(@pass, @i%LEN(@pass)+1, 1) )
set @j = @j ^ @i ^ @seed1
set @t = @t + CHAR(@j%256)
set @i = @i + 1
end
print @t
--Zmiana na wejściu o odległości Hamminga równej 1
--powinna spowodować zmianę lawinową na wyjściu
Subskrybuj:
Posty (Atom)
