Daniel Molina

The XPCOM API can allow you to create low level extensions — I mean written in C++, with support for C and assembler through C++ — and plug ins for Mozilla products. For example, you can create an extension to browse IMAP folders from Mozilla Firefox. This API is analogous to the COM+ API on Micro$oft Windows. One of my most recent projects, is a Firefox extension to handle SNMP protocol requests from JavaScript, so my extension is applied from the JavaScript within the HTML in the browser, allowing Firefox to act as an SNMP client. The extension is working fine, without memory leaks and allows you to do get and walk request. Possibly it will be expanded to more requests on the future.

interface definition

JavaScript requires class definitions to work. So, you need to create IDL definitions of your scriptable classes. The syntax for the XPIDL is quite standard, so isn’t difficult to create interfaces with this IDL variant. To allow you to use IDL defined interfaces on JavaScript, interfaces must be defined as scriptable and must be derived from nsISupports interface, with an unique uuid. Let me show you an example:

#include "nsISupports.idl"
#include "nsIMyProtocolRequest.idl"
#include "nsIMyProtocolResponse.idl"
#include "nsIMyProtocolError.idl"
#include "nsIMyProtocolStatus.idl"
#include "nsIMyProtocolService.idl"

[scriptable, uuid(3455c51a-3323-4343-844f-2342526113c2)]
interface nsIMyProtocolService : nsISupports
{
    readonly attribute nsIMyProtocolError error;
    nsIMyProtocolResponse get(in nsIMyProtocolRequest req);
    nsIMyProtocolStatus getStatus(in nsIMyProtocolRequest req);
};

This will create a XPCOM object wrapped in JavaScript similar to the following example:

var nsIMyProtocolService = {
    error: new nsIMyProtocolError(),
    get: function (req) {
    },
    getStatus: function (req) {
    },
};


class definition

Here, error is a read only attribute, and get() and getStatus() are methods. But this isn’t enough, that is just the interface definition. The implementation must be done in C++ so the interface defintion is transformed to C++ code — a C++ header specifically — which must be included in the class implementation C++ code file. Where need to consider a special note on class attributes and methods: Every method implementation has the form: nsresult MethodName(…input parameters if any…, …output parameters if any…), where nsresult is the type of the returned status to the XPCOM API to let it know how was executed the method, so you can return NS_OK on execution correctness, NS_ERROR_NULL_POINTER for invalid input as null pointers, NS_ERROR_INVALID_POINTER for invalid variable input and so on. Well, the class definition inside the implementation file, should look as follow:

class nsMyProtocolService : public nsIMyProtocolService
{
public:
    nsMyProtocolService();
    ~nsMyProtocolService();

    nsresult GetError(nsIMyProtocolError **out);
    nsresult Get(nsIMyProtocolRequest *req,
                 nsIMyProtocolResponse **out);
    nsresult GetStatus(nsIMyProtocolRequest *req,
                 nsIMyProtocolStatus **out);
private:
    int statusCode;
    int errorCode;
    char *errorString;
    nsIMyProtocolError *currentError;
}


class implementation

You must be a two star programmer to know how to implement the argument passing and method output, but I know that you are a good C and C++ programmer, so this is not an obstacle and you can act as a three star programmer without problems. So, the implementation, for example for the GetError(), which has been mapped to the error attribute on the nsIMyProtocolService interface, should look as follows:

nsresult
nsMyProtocolService::GetError(nsIMyProtocolError **out)
{
    nsMyProtocolError *rout;
    result = NS_ERROR_NULL_POINTER;
    if (out == NULL || out == nsnull) {
        return result;
    }
    rout = new nsMyProtocolError();
    if (rout == NULL) {
        result = NS_ERROR_NOT_INITIALIZED;
        return result;
    }
    if (currentError != NULL && currentError != nsnull) {
        NS_RELEASE(currentError);
        delete currentError;
    }
    rout->SetErrorCode(errorCode);
    rout->SetErrorString(errorString);
    NS_ADDREF(rout);
    *out = rout;
    result = NS_OK;
    return result;
}

On the example above, we have created a new pointer to the nsIMyProtocolError interface implementation. That pointer, before is being returned to the JavaScript and wrapped by the XPCOM API, must have an increased reference count, so Firefox do not remove that object. But as any language which uses reference counting in its garbage collection tasks, requires a reference counting decrement before the object is released. So you need to release those references using the NS_RELEASE macro. As any software development — with or without a garbage collector behind — you must be careful with the memory usage. Any object with a reference count different from zero, will hang Firefox, so you need to release reference counting on destructors too.

nsMyProtocolService::~nsMyProtocolService()
{
    if (currentError != NULL && currentError != nsnull) {
        NS_RELEASE(currentError);
        delete currentError;
    }
}


The example above shows how the destructor releases the reference counting for the currentError object. But think a little. Every time you call GetError(), in other words, you request the error attribute on the nsIMyProtocolService instance, you are increasing references which are left without being decreased. You need an storage for those pointers, so you can use any collection class that you want and is supported by your platform, but is recommended that you use the kind of storage classes which are present on the XPCOM API. How to create a collection?


nsCOMPtr<nsIMutableArray> container;
container = do_CreateInstance(NS_ARRAY_CONTRACTID);

The nsIMutableArray provides an array class which can be used inside your Firefox extension and also it can be exposed as a JavaScript array, it is an scriptable class, and also provides methods for pushing and extracting elements as the JavaScript array does, so you can use methods such as GetLength(), which is mapped to the length attribute, AppendElement(), which is mapped to the append() method, QueryElementAt() which is mapped to the array[index] operator. The do_CreateInstance template will allow you create instances of you interfaces, when you are requesting them from other extensions. For example if you want to use the WebDAV extension from your C++ extension, you need to use do_CreateInstance template.


component declaration

Finally, you need to register and expose your components to the JavaScript interface and the XPCOM API, so you need to define a contract identifier and add some static code to you extension.

#define NS_MYSVC_CONTRACTID         "@mozilla.org/myprotocol/service;1"
#define NS_MYSVC_CID                                            \
    { /* 3455c51a-3323-4343-844f-2342526113c2 */                \
        0x3455c51a,                                             \
            0x3323,                                             \
            0x4343,                                             \
            { 0x84, 0x4f, 0x23, 0x42, 0x52, 0x61, 0x13, 0xc2 }  \
    }

NS_GENERIC_FACTORY_CONSTRUCTOR(nsMyProtocolService)
NS_DECL_CLASSINFO(nsMyProtocolService)
static const nsModuleComponentInfo components[] =
{
    { "My Protocol Service", NS_MYSVC_CONTRACTID, NS_MYSVC_CID,
      nsMyProtocolServiceConstructor,
      NULL, NULL, NULL,
      NS_CI_INTERFACE_GETTER_NAME(nsMyProtocolService),
      NULL,
      &NS_CLASSINFO_NAME(nsMyProtocolService)
    }
};

NS_IMPL_NSGETMODULE(nsJxSNMPService, components)

This can be used as template, where the components array contains the interface definitions and interface implementation references that allow you to use those classes from JavaScript. This code will:

NS_GENERIC_FACTORY_CONSTRUCTOR
Will declare nsMyProtocolServiceConstructor to be used as default constructor by the do_CreateInstance() template.
NS_DECL_CLASSINFO
Will declare class information referencing the nsMyProtocolService class to allow you to use that class information from JavaScript to be exposed to the XPCOM API.
NS_MYSVC_CONTRACTID
Contract (interface) identifier, it will be required by your JavaScript to instantiate you class, using the interface as was defined in nsIMyProtocolService.
NS_MYSVC_CID
This is the unique uuid identifier for your component. Remember that those components are quite analogous to the COM+ components on the Window$ platform.
NS_IMPL_NSGETMODULE(nsJxSNMPService, components)
This line finally will expose — through static code — your component to the XPCOM API, and will allow your class to being used from JavaScript or your Firefox extension. Remember that components is an array which can hold multiple interface and class definitions.


component exposition

If you followed the article with a conscious reading, the following lines of JavaScript will bring you the proper guide to instantiate your own component. I’m assuming that you are an experienced system programmer and web developer to handle this article:

const C = Components;
const CI = C.interfaces;
const CL = C.classes;

function getContract(contract) {
  try {
    return C.classes[contract];
  } catch (e) {
    alert(e.message);
  }
}

function getService(contract, iface) {
  try {
    return getContract(contract).getService(CI[iface]);
  } catch (e) {
    alert(e.message);
  }
}

function getInterface(contract, iface) {
  try {
    return getContract(contract).createInstance(CI[iface]);
  } catch (e) {
    alert(e.message);
  }
}

try {
    var myService = getService("@mozilla.org/myprotocol/service;1",
                               "nsIMyProtocolService");

    var myRequest = getService("@mozilla.org/myprotocol/request;1",
                               "nsIMyProtocolRequest");

    myRequest.first_argument = 200;
    myRequest.second_argument = "hello world!";
    var myResponse = myService.get(myRequest);
    if (typeof(myService.error) == "object"
        && myService.error.status != 0) {
        alert(myService.error.toString());
    }
} catch (e) {
    alert(e.message);
}


interesting code to look

You can start downloading the Firefox source code and take a look on the following interfaces:

  • extensions/webdav, this defines the "@mozilla.org/webdav/service;1" interface, allowing you to create WebDAV clients from JavaScript.
  • extensions/webservices, this defines the "@mozilla.org/xmlextras/proxy/webserviceproxy;1," and similar interfaces, allowing you to create WebService client proxies from JavaScript.
  • extensions/sql, this folder stores "@mozilla.org/sql/connection;1" and similar interfaces, so Firefox can be used directly as client to query some RDBMS engines — such as PostgreSQL and SQLite.

You can go on deeper reading code and references to enhance your XPCOM component development ;)


references

share this article at: LinkedIn del.icio.us Digg Reddit Facebook Twitter Google Bookmarks



Copyright © 2010 Daniel Molina Wegener
Atribución-No Comercial-Sin Derivadas 2.0 Chile
Creative Commons License


© Daniel Molina Wegener for coder . cl, 2010. | Permalink | No comment
Post tags:


Sun Aug 1 00:02:26 2010
 
     
   
 
Gonzalo Diaz

No hay extracto porque es un artículo protegido.

[...]



Wed Jul 28 20:44:48 2010
 
     
   
 
Daniel Molina

Traditionally, C programmers and Java programmers are accustomed to use the type casting form: (type)variable. C++, instead of that classical type casting form, has various type casting operators, used for different purposes. Each operator is used with different kinds of references, for example, you can not use the static_cast operator with virtual classes. Type casting operators in C++ has a syntax very similar to C++ Templates: cast_operator<type>(variable).

const_cast operators

If you want an expression to being const, just use the const_cast operator. For example if a legacy function written in C requires of a const argument, just pass a non-const argument by using the const_cast operator:

extern "C" {
    void my_function(const char *p);
};

std::string s = std::string("hello world");
my_function(const_cast<char *>(s.c_str()));

static_cast operator

The static_cast operator performs the conversion unconditionally, without verifying data types at compile time. This makes this operator quite dangerous, so, you need to verify data types before you use variables in this kind of type casting.

if (typeid(*ptr_a) == typeid(MyClass)) {
    ptr_b = static_cast<MyClass>(ptr_a);
    ptr_b->applySomeMethod();
}

You can use the typeid C++ builtin to verify the data type. Also, you must consider that this operator is valid only if the conversion is explicit. Suppose Parent is a base class to Child and that Unrelated is an unrelated class. Then conversions from Child to Parent are valid, but a conversion from Child to Unrelated is disallowed:

Parent a;
Child b;
Parent *a_1 = static_cast<Parent *>(&b); // valid upcast
Unrelated *c_1 = static_cast<Unrelated *>(&b_1); // invalid, Unrelated

The best usage for the static_cast opertaor, are numerical conversions, so you can cast from int, double, float and others of similar type to another int, double, float and similar types, including enum types. Some compilers does this kind of conversion explicit, but more strict compilers usually throw the proper warning on this kinds of assignment, without the proper type casting operation (line 4).

float a;
int b;
a = static_cast<float>(b);
a = b;

dynamic_cast operator

The dynamic_cast operator, among other things, does a runtime check over types applied on the cast operation. As the above example of static_cast operator, dynamic cast does the typeid() checking. Then, if you have a pointer or reference to an object whose declared type is a base class, but you need to obtain a derived class pointer or reference, you should use dynamic_cast, since the dynamic_cast operator is another RTTI (Run-time type information) operator. The use of dynamic_cast derives into more overhead of your program, so you must use it with moderation.

if (ptr_b == static_cast<MyClass>(ptr_a);) {
    ptr_b->applySomeMethod();
}

If the type checking and conversion fails, the operator returns a non-null reference, else it will return a null reference (zero). Also, some compilers will advice on the proper usage of the dynamic_cast operator, the more strict ones, will throw an error.

Parent a;
Child b;
Parent *a_1 = dynamic_cast<Parent *>(&b); // valid upcast
Unrelated *c_1 = dynamic_cast<Unrelated *>(&b_1); // invalid, returns NULL

reinterpret_cast operator

This — possibly — is the most risky to use type casting operator. It completely transforms a pointer to very different types. For example:

some_struct_s {
    short a;
    short b;
};
typedef struct some_struct_s some_struct_t;
some_struct_t *s;
unsigned long v = 0xd34db33f;
s = reinterpret_cast<some_struct_t *>(&v);
std::cout << s->a; // display first 2 bytes of value

As the example above, the pointer was completely transformed to different kind, with the dangerous assumption that the platform has a byte alignment that make possible to access the first to bytes of some address using this kind of operation. This cast is not portable, some compilers should throw some error about it.

The fact is that the reinterpret_cast operator overrides the initial declaration of the given variable, and makes possible to that variable to being reinterpreted as a different one. The usage of the reinterpret_cast must be done careful, for example for derived to base class reinterpretation.

BaseClass a;
DerivedClass *c = reinterpret_cast<DerivedClass *>(&a);

Since many of this kind of conversions are not possible in all compilers, you must try to setup your compiler to the most pedantic flags that it can allow. For example on GCC, you should use -Wall -Wextra -Wshadow -pedantic -std=c++98 as compiler flags. It will keep your code portable and will allow you to create more standarized programs.

Here is a full compiling example of the core ideas in this post:


class A {
public:
	A();
	~A();
};

class B : public A {
public:
	B();
	~B();
};

A::A() {
}

A::~A() {
}

B::B() : A() {
}

B::~B() {
}

int
main(int argc, char **argv)
{

	A *ptr_a = new A();
	B *ptr_b = new B();

	A *a_1 = static_cast<A *>(ptr_b);
	B *b_1 = static_cast<B *>(ptr_a);

	A *a_2 = dynamic_cast<A *>(ptr_b);

	A *a_3 = reinterpret_cast<A *>(ptr_b);
	B *b_3 = reinterpret_cast<B *>(ptr_a);

	const A *a_4 = const_cast<A *>(ptr_a);
	const B *b_4 = const_cast<B *>(ptr_b);

	delete ptr_a;
	delete ptr_b;

	return 0;

}
share this article at: LinkedIn del.icio.us Digg Reddit Facebook Twitter Google Bookmarks



Copyright © 2010 Daniel Molina Wegener
Atribución-No Comercial-Sin Derivadas 2.0 Chile
Creative Commons License


© Daniel Molina Wegener for coder . cl, 2010. | Permalink | No comment
Post tags:


Sun Jul 25 21:25:52 2010
 
     
   
 
Alejandro Lopez

Felicidad Cargado originalmente por yopuz


Tue Jul 20 21:41:14 2010
 
     
   
 
Daniel Molina

snmptrapd(8) is a SNMP trap daemon, in other words, it captures SNMP notifications from the network and similar devices. In this post I will try to explain how to configure this daemon to allow a network server to process SNMP traps using both, embeded perl handlers for snmptrapd(8) and plain standard input — or stdin — handlers.

daemon configuration

The daemon is quite easy to configure, you must setup the snmptrapd.conf(5snmp) file. For this configuration, you must read your desired configuration options, such as logging and execution. For example if we have a community called inetsnmp, we can configure the file to allow traps from that community and also configure a trap handler written in perl.


# configure inetsnmp community to allow logging,
# execution of handlers and network traffic.
authCommunity   log,execute,net         inetsnmp

# perl embeded handler.
perl do "/usr/share/snmp/handler/trapdembed.pl"

This configuration is not enough, the snmptrapd(8) daemon uses hosts.allow(5) facility, so we need to add the proper rule in that file:


snmptrapd : 192.168.100.0/255.255.255.0 : allow
snmptrapd : 10.10.10.0/255.255.255.0 : allow

the embeded perl handler

#!/usr/bin/perl -w
#

# strict perl is better
use strict;
use FileHandle;
use Data::Dumper;
use NetSNMP::TrapReceiver;

# we create a sample/demo log file...
my $log = FileHandle->new("/var/log/snmptrapsample.log", "a+") ||
    die "Failed to open log file";

# how we process an SNMP variable
sub process_var {
    my ($var) = @_;
    my %res;
    my $name = "$var->[0]";
    my ($vt, $vv) = split /: /, "$var->[1]";
    $res{'oid'} = $name;
    $res{'type'} = $vt;
    $res{'value'} = $vv;
    return \%res;
}

# our default receiver
sub default_receiver {
    my ($pdu, $ivars) = @_;
    my %vars;
    $log->print(Dumper($pdu));
    foreach my $k (@{$_[1]}) {
        $vars{$k->[0]} = process_var($k);
    }
    $log->print(Dumper(\%vars));
    $log->flush;
}

# every OIDs pass through the default_receiver
NetSNMP::TrapReceiver::register("all", \&default_receiver) ||
    die "Failed to laod Sample Trap Receiver\n";

# status message...
print STDERR "Loaded Sample Trap Receiver\n";

This perl(1) handler will allow you basically to create a handler which is capable to process SNMP notifications creating two main variables on the handler itself $pdu which is the reference to the %pdu hash and %vars hash. Both hashes contains the proper data to process the request as you want:


%pdu = {
    'notificationtype' => 'TRAP',
    'receivedfrom' => 'UDP: [10.10.10.1]:53951->[192.168.100.5]',
    'version' => 1,
    'errorstatus' => 0,
    'messageid' => 0,
    'community' => 'public',
    'transactionid' => 1,
    'errorindex' => 0,
    'requestid' => 1012897136
};

%vars = {
    'IF-MIB::ifDescr' => {
        'value' => 'eth0',
        'type' => 'STRING',
        'oid' => 'IF-MIB::ifDescr'
    },
    'IF-MIB::ifAdminStatus.1' => {
        'value' => '1',
        'type' => 'INTEGER',
        'oid' => 'IF-MIB::ifAdminStatus.1'
    },
    'DISMAN-EVENT-MIB::sysUpTimeInstance' => {
        'value' => '(0) 0:00:00.00',
        'type' => 'Timeticks',
        'oid' => 'DISMAN-EVENT-MIB::sysUpTimeInstance'
    },
    'IF-MIB::ifIndex.1' => {
        'value' => '1',
        'type' => 'INTEGER',
        'oid' => 'IF-MIB::ifIndex.1'
    },
    'SNMPv2-MIB::snmpTrapOID.0' => {
        'value' => 'IF-MIB::linkUp',
        'type' => 'OID',
        'oid' => 'SNMPv2-MIB::snmpTrapOID.0'
    },
    'IF-MIB::ifOperStatus.1' => {
        'value' => '1',
        'type' => 'INTEGER',
        'oid' => 'IF-MIB::ifOperStatus.1'
    }
};

Where each OID or variable, can be treated by using the NetSNMP::OID package. Fora stdin handler, if you don’t know about perl(1), the difference is made on the snmptrapd.conf(5snmp) file, instead of configuring a global perl script which itself registers which OIDs will handle, you need to configure a global trap handler or each handler for each OID that you want to handle:


# configure inetsnmp community to allow logging,
# execution of handlers and network traffic.
authCommunity   log,execute,net         inetsnmp

traphandle     default           /usr/share/snmp/handler/defaultstding.py   default
traphandle     IF-MIB::linkUp    /usr/share/snmp/handler/ifuphandler.py     up

This will make your script or application to receive the OID data from stdin as follows:

router
UDP: [10.10.10.1]:37745->[192.168.100.5]
DISMAN-EVENT-MIB::sysUpTimeInstance 0:0:00:00.00
SNMPv2-MIB::snmpTrapOID.0 IF-MIB::linkUp
IF-MIB::ifIndex.1 1
IF-MIB::ifAdminStatus.1 up
IF-MIB::ifOperStatus.1 up
IF-MIB::ifDescr eth0

And also will require that you will enable in some manner the processing of that data as plain text.

Good luck configuring SNMP traps :)

share this article at: LinkedIn del.icio.us Digg Reddit Facebook Twitter Google Bookmarks



Copyright © 2010 Daniel Molina Wegener
Atribución-No Comercial-Sin Derivadas 2.0 Chile
Creative Commons License


© Daniel Molina Wegener for coder . cl, 2010. | Permalink | No comment
Post tags:


Fri Jul 16 23:28:27 2010
 
     
   
 
Gonzalo Diaz

No hay extracto porque es un artículo protegido.

[...]



Sat Jul 3 04:06:16 2010
 
     
   
 
Daniel Molina

Optimizing SQL queries is quite simple task, you just need to follow some rules on how you sort the filtering criteria and how you use your select statements. I will try to explain how you can optimize your queries in this post.

named columns

Use named columns, instead of using the * wildcard. For example:

select
    t.*
from
    tbl as t
where
    t.tab_date > current_date - interval 1 month
order by
    t.tab_date desc;

Will be more slower than:

select
    t.tab_id,
    t.tab_state,
    t.tab_date,
    t.tab_name
from
    tbl as t
where
    t.tab_date > current_date - interval 1 month
order by
    t.tab_date desc

join filtering

If you filter on join, your query will be faster, for example:

select
    t1.tab_id,
    coalesce(t2.tab_date, current_date) as tab_date,
    t1.tab_name
from
    table1 as t1
        left join table2 as t2 on (t1.tab_id = t2.tab_tab_id)
where
    t2.tab_date IS NULL or t2.tab_date > current_date - interval 1 month;

Will be more slower than

select
    t1.tab_id,
    coalesce(t2.tab_date, current_date) as tab_date,
    t1.tab_name
from
    table1 as t1
        left join table2 as t2 on (t1.tab_id = t2.tab_tab_id
            and t2.tab_date > current_date - interval 1 month);

smaller set first

The smaller set must selected first, for example:

select
    t1.tab_id,
    coalesce(t2.tab_date, current_date) as tab_date,
    t1.tab_name
from
    table1 as t1
        left join table2 as t2 on (t2.tab_tab_id = t1.tab_id
            and t2.tab_date > current_date - interval 1 month);

Will be more slower than:

select
    t1.tab_id,
    coalesce(t2.tab_date, current_date) as tab_date,
    t1.tab_name
from
    table1 as t1
        left join table2 as t2 on (t1.tab_id = t2.tab_tab_id
            and t2.tab_date > current_date - interval 1 month);

Since t1 has less rows than t2, and t2 is referencing t1. Assuming that t1 has a smaller set of rows and is the referenced table. This applies to column selection too and where statements.

notes

You must measure the time of your queries, so you can have a more precise query. Those rules are not absolute.

share this article at: LinkedIn del.icio.us Digg Reddit Facebook Twitter Google Bookmarks



Copyright © 2010 Daniel Molina Wegener
Atribución-No Comercial-Sin Derivadas 2.0 Chile
Creative Commons License


© Daniel Molina Wegener for coder . cl, 2010. | Permalink | No comment
Post tags:


Fri Jul 2 13:13:24 2010
 
     
   
 
Gonzalo Diaz

Crónicas de un régimen auto-impuesto. Lunes 28 de Junio del 2010 Chile pierde 3-0 ante Brasil por la Copa del Mundo 2010 de Sudáfrica. Además con el cuerpo cansado después de celebrar el paso a...

[...]



Wed Jun 30 20:02:47 2010
 
     
   
 
Daniel Molina

Hello, today I’ve released pyxser-1.4.4r, the publishing message is as follows:


Hello Python Community.

I’m pleased to announce pyxser-1.4.4r, a python extension which contains functions to serialize and deserialize Python Objects into XML. It is a model based serializer. Here is the ChangeLog entry for this release:

1.4.4r (2010.02.10):

        Daniel Molina Wegener 

        * src/include/pyxser_collections.h - added set handling
        function prototypes. Added support for unicode
        key names, which are converted to the user settings
        encoding (ie utf-8) inside the XML output.
        * src/pyxser_serializer.c - removed memory leak. Addded
        support for unicode object names in dictionary/list types.
        * src/pyxser_collections.c - added set handling function
        prototypes. added name property handling algorithm, so
        non string name properties are not serialized. I shall
        extend it to other modules.
        * src/pyxser_tools.c - added set handling prototypes and
        set type checking function.
        * test-utf8-leak.py - added serialization of SQL Alchemy
        objects, so we can test more complex Python objects
        serialization.
        * test-utf8-sqlalchemy.py - added sql alchemy object
        serialization test.
        * src/pyxser_serializer.c - reduced serialization algorithms,
        replacing deep nested if statements by flatten ones.
        * src/pyxser_collections.c - reduced serialization algorithms
        replacing deep nested if statements by flatten ones.
        * src/pyxser_typem.c - reduced serialization algorithms,
        replacing deep nested if statements by flatten ones.

        Thanks to pyxser users for their feedback.

This release contains some bug fixes, mainly related to type checking and type handling. I hope this small extension will help you on your programming tasks.

Thanks and best regards…


I hope that this module can help you in your development tasks and thanks for your feedback.

share this article at: LinkedIn del.icio.us Digg Reddit Facebook Twitter Google Bookmarks



Copyright © 2010 Daniel Molina Wegener
Atribución-No Comercial-Sin Derivadas 2.0 Chile
Creative Commons License


© Daniel Molina Wegener for coder . cl, 2010. | Permalink | No comment
Post tags:


Sun Jun 20 16:24:50 2010
 
     
   
 
Alejandro Lopez

Post - Carrusel Originally uploaded by Autumn leaves fallPensar que hace poco mas de un año, estaba tirandole mierda al mundo y a la vida.:DAhora ando como una perdiz.


Tue May 18 20:45:48 2010
 
     
   
 
Andres Ovalle

DPL 2010/2011

En conformidad con la Constitución the Debian Project a elegido a Stefano Zacchiroli como nuevo Debian Project Leader para el periodo 2010/2011.
Stefano es Desarrollador Debian desde Marzo del 2001, el contribuye con varios servicios esenciales tales como, Debian’s Package Tracking System y pertenece al Quality Assurance Team. Luego de su elección el declaro: “No puedo estar mas orgulloso de ser un miembro de Debian Project. La cantidad de desarrolladores que tomaron parte de nuestro proceso de elección democrática — candidatos, votantes y participantes de campaña — me hacen muy feliz. Vale decir que estoy un poro asustado ahora, pero puedo asegurar que voy a hacer mi mejor esfuerzo para cubrir las expectativas de todos los colaboradores del Debian Project”.
El project leader saliente, Steve McIntyre, fue electo en el 2008.
Luego de liderar el proyecto por dos años, Steve prefirió no ir por la re-elección.
Steve felicito a Stefano: “Lo e pasado muy bien trabajando para Debian como DPL y estoy mas que feliz seguir trabajando bajo el mando de Stefano.
EL tiene ideas excelentes y realizara un muy buen trabajo.” El proyecto Debian también desea agradecer a Steve por su gran trabajo y sobresaliente compromiso con el proyecto.
Los candidatos de este año fueron Stefano Zacchiroli, Wouter Verhelst, Charles Plessy y Margarita Manterola. Luego de seis semanas de periodo electoral el proyecto Debian eligio a Stefano Zacchiroli para ser su nuevo Debian Project Leader.
Los detalles de las elecciones los puedes encontrar en la siguiente pagina:  votación.?


Sun Apr 18 13:58:23 2010
 
     
   
 
Patricio Perez

Hace unas semanas gracias a la ayuda de sarah y ryan he estado trabajando solucionando bugs en el sitio Getpersonas.com (El sitio esta hecho en PHP, y el repositorio usa SVN), esto me ha traído devuelta al mundo de los sistemas de control de versiones (Lo que es genial, por que me gustaba caleta hacer commits, y tener todo ordenado, como cuando trabajaba …)

Cuando ya tenia mis permisos de commit listos para el repo SVN, ryan me recomendó git-svn (Lo que también es genial, por que tenia mas experiencia con Git que con SVN). Así que para aprovechar los bytes de este post, pondre mi setup de Git+SVN, algo del workflow diario y lo ultimo con lo que estuve jugando esta semana: ZSH (Aun estoy amando la integracion con Git).

It’s time to start

Montar el repositorio con Git-SVN

La instalación es muy simple, en Ubuntu basta con un

sudo apt-get install git-svn git-core

Ahora comenzamos a clonar el repo, por ejemplo para el repo de getpersonas en mozilla:

mkdir getpersonas && cd getpersonas

git svn init https://svn.mozilla.org/projects/getpersonas.com/trunk/

git svn fetch -r $REVISION

# (Donde $REVISION es la ultima revision donde se toco la direccion del repo, si le hacen un svn info http://svn.mozilla.org/projects/getpersonas.com/trunk/ veran “Revision del último cambio”. Si quieren le pueden tirar un git svn fetch a secas, pero se bajara TODAS las revisiones del repo svn, osea que si tienen miles y miles de commits, se volveran locos en pocos minutos)

# Si por algun motivo les pasa que se baja la revision, pero los ficheros no aparecen y el git status les dice que hay cambios hechos, y que son ficherros eliminados, intenten dando un

git reset && git checkout .

Con esto ya estamos listos para comenzar a trabajar :D

Git branchs, patches, merge y commits al server svn

Para trabajar en los bugs, ryan me recomendo usar un branch local de git, para cada bug. Easy cake.

git checkout -b sumario_bug

Y veremos las magicas palabras “Switched to a new branch ’sumario_bug’”, pueden usar cualquier nombre para la branch local, ojala uno descriptivo para acordarse.

Aquí podemos ir realizando los cambios para arreglar el bug (O meter funcionalidades nuevas, el mundo es suyo). Pueden hacer commits al branch, por ejemplo con git commit -a. Con esto listo, podemos usar format-patch y enviar parches:

git format-patch master -o ~/parches/

Este ultimo comando nos generara un parche git, en el directorio ~/parches. Cuando tengamos aprobados los cambios, podemos hacerle un merge con master (la rama principal):

git checkout master

git merge sumario_bug

git svn rebase

Con esto, cambiamos al branch master, hicimos un merge del branch local sumario_bug (Nota aqui, si hicieron mas de un commit en el branch sumario_bug, y quieren que se refleje como solo un commit en SVN, deberan aplicar el switch –squash al git merge), y con el rebase, bajamos los posibles cambios que tenga el repositorio svn y aplicamos nuestros cambios sobre eso (Atentos si hay problemas con el merge que esto provocara). Si no tuvimos ningun problema al hacer el merge y el rebase, o los solucionamos, estamos listos para hacer commit hacia SVN:

git svn dcommit

Que nos pediria los datos del server svn (En este caso, puedo hacer commit por https con mis datos LDAP)

There, estariamos listos para continuar con otro bug.

Para actualizar el repo podemos usar git svn fetch o git svn rebase (El fetch solo baja los cambios, mientras que el rebase intentara un merge si tenemos cambios en la rama local)

Cosas cools, git stash

Otra herramienta genial en git, seria stash, ponganse en este caso, estan trabajando en un branch, tienen harto trabajo hecho y aun no le dan un commit, y llega un bug feo que hay que solucionar ASAP, tendrian que hacer un commit tipo “Dejo guardado el trabajo en esta rama para trabajar en el desgraciado bug feo”; con stash pueden solucionar esto fácilmente:

git stash save "Bug #1234: Cambiar identacion para que el codigo se vea mas lindo"

git checkout master

git checkout -b bug_desgraciado_asap

[...] Terminaron de trabajar en el bug, le dieron commit y todo el cuento, ahora a trabajar en el branch que teniamos antes

git checkout mi_viejo_branch_ya_no_es_lo_que_era

git stash pop stash@\{0\}

Y aplicara los cambios que teníamos antes de trabajar en el bug feo!

Un poco mas sobre stash seria que, no es necesario pasarle un nombre al git stash save, con git stash list listaran los stash que tienen guardados, con git stash show -p stash@\{0\} u otro numero, mostraran el contenido del stash (Noten que el -p viene de git diff, asi que pueden usar cualquier switch del git diff).

Un pager mas bonito

Cuando hacen un git diff, quizas no les guste mucho, si es así pueden usar otro comando para el pager, por ejemplo most:

# ~/.gitconfig

[...]

[core]

pager = most +s +’/—’

[...]

Necesitaran tener most instalado, la otra gracia que hará, será buscar la línea que comience con — (Que es como git define cada cambio, así que automáticamente llegaran al primer cambio en un git diff por ejemplo).

Finalmente, ZSH

El otro dia netkrash nos contaba en irc que estaba usando zsh con los scripts de Oh My ZSH, que tenía completación de nombres para el kill (Onda kill -9 Adi[tab] buscaba el proceso con ese nombre y extraia el pid), completación de hostnames para ssh|scp, y lo que mas me intereso, integración con git … cuando leí eso ultimo lo instale altiro!

Bueno, la instalacion de ZSH es bien simple:

sudo apt-get install zsh

Luego pueden instalar oh my zsh, el instalador automático bastara (Nota para algunos, NECESITAN tener instalado zsh antes de oh my zsh, aviso por si las moscas …):

wget http://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

Y ya estan listos, si quieren meter mano en los configs de oh my zsh, pueden hacerlo en .oh-my-zsh. Al momento tengo algunos cambios en mi branch local:

  • Desactivar el menu de zsh (Para la autocompletacion, me acostumbre al completado como en bash) (Thanks netkrash)
  • Completacion de hosts ssh|scp segun ~/.ssh/config en vez del known_hosts (Netkrash again)
  • Completacion de usuarios con uid superior a 1000 (Comunmente usuarios reales), mostrar a root y ocultar a nobody.
  • El atajo de oh my zsh de git diff (gd), se le pasa mate por un pipe, quite eso por que ya tengo un pager configurado.
  • Trackear los ficheros de custom/
  • Tema ‘idk’ para zsh (Para cambiar los temas de zsh basta con cambiar la variable ZSH_THEME en su ~/.zshrc), basado en macovsky y wezm (Incluidos en oh my zsh). Preview.

En fin, si les interesan los cambios, en este tar vienen todos los patches que he aplicado (Pueden crear un branch en .oh-my-zsh con git checkout -b mismods y luego aplican los parches con git am nombreparche.patch)

Me faltaron un poco de fuentes, Viget entregaba un par de tips, muy buenos.


Mon Mar 22 17:19:11 2010
 
     
   
 
Rodrigo Zamora

Cuando se necesita cambiar la zona horaria en tu servidor debian (supongo que en distribuciones basadas en él, como lo es ubuntu igual sirve), basta con ejecutar el comando:

dpkg-reconfigure tzdata

Con esto aparecerá un asistente que permite realizar el cambio de forma bastante sencilla. Para el caso de Chile, este 2010 se ha optado por prolongar el cambio de horario hasta abril, de ahi la necesidad de ajustar la zona a una diferente.


Tue Mar 16 12:35:38 2010
 
     
   
 
Rodrigo Zamora

Hoy falla repentinamente una partición de un equipo con raid 1 por software en linux. Simplemente no era posible montar el dispositivo /dev/md3

Ante esa situación y considerando que era un apartición /home/ el procedimiento seguido fue el siguiente:

tener claridad de que particiones componen el arreglo, en este caso /dev/sda3 y /dev/sdb3

Revision de particiones por separado.

fsck.ext3 /dev/sda3

fsck.ext3 /dev/sdb3

Volver a incorporar el raid al sistema

mdadm – -assemble /dev/md3 /dev/sda3 /dev/sdb3

Revisión del Raid armado

fsck.ext3 /dev/md3

Incorporar nuevamente los arreglos al mdadm.conf

mdadm – -detail – -scan >> /etc/mdadm/mdadm.conf

Con esto los arreglos quedaron funcionales


Fri Feb 26 14:33:53 2010
 
     
   
 
Rodrigo Zamora

Como Documentación personal dejo registro de algo que he hecho en otras oportunidades, pero de lo cual no siempre recuerdo todos los parámetros. :wink:

Para quien lea éste artículo, daré solo algunas pautas esenciales para la implementación del protocolo SSL sobre plataformas WEB y el uso de certificados auto firmados.

OBJETIVOS

  • Comprender la utilidad de usar SSL sobre plataformas WEB y conseguir un sitio https
  • Entender cuales son los requisitos para que un sitio web sea reconocido como válido por un browser
  • Comprender como generar y auto firmar un certificado digital.
  • Configurar Clientes y Servidores para un sitio https auto firmado.
  • UTILIDAD DE UN SITIO HTTPS

    Quien no sea muy entendido, podrá desconocer que cuando son insertados datos dentro de formularios de sitios que solamente usan http, estos datos son enviados en texto claro por la red y pueden ser capturados y utilizados de manera maliciosa por cualquiera que tenga acceso a los equipos de comunicaciones por donde pasan estos datos.

    REQUISITOS DE UN SITIO VÄLIDO

    Para que un sitio sea reconocido como un sitio seguro válido, debe cumplir con 3 condiciones esenciales:

  • Contar con un certificado digital válido firmado por una entidad reconocida
  • El certificado debe ser emitido para el sitio específico.
  • El certificado del sitio debe contar con una fecha válida (los certificados cuentan con fecha de caducidad)
  • CERTIFICADOS AUTO FIRMADOS

    Cuando se utilizan certificados, estos deberían ser firmados por una entidad reconocida ( C A ) como lo es verisign. Los navegadores tienen registrados una gran cantidad de entidades reconocidas dentro de lo que se conoce como Entidades Raiz de Confianza. Cuando un administrador de sistemas decide generar por si mismos los certificados y también firmarlos, se produce una advertencia por parte del navegador, indicando que la entidad emisora que ha firmado el certificado no es de confianza y que puede tratarse de un certificado inválido o un sitio falsificado.

    La manera correcta de habilitar un sitio auto firmado consiste en generar los certificados, firmarlos y hacer que los clientes reconozcan al equipo que los firma como una CA válida dentro de los certificados raíz de confianza

    EMISION Y FIRMA DE CERTIFICADOS

    A continuación la forma de emitir certificados para la CA y un sitio web utilizando Linux, apache2 y openSSL. ( Fuente Original )

    Generando Certificados para la CA.

    En mi caso, voy generar una Entidad Emisora de Certificados Llamada zamoranelson.cl, por lo que he de generar los certificados y llaves correspondientes llenando los datos solicitados por openSSL.

    Creamos un directorio llamado / etc / apache2/ssl y ejecutamos los siguientes comandos.

    openssl genrsa -des3 -out zamoranelson.cl-ca.key 2048

    openssl req -new -x509 -days 3650 -key zamoranelson.cl-ca.key -out zamoranelson.cl-ca.crt

    openssl x509 -in zamoranelson.cl-ca.crt -text -noout

    Con esto ya podemos comenzar a firmar certificados para nuestros sitios web por 10 años mas.

    Ahora firmaré un certificado para mi sitio personal rodrigo.zamoranelson.cl

    openssl genrsa -des3 -out rodrigo.zamoranelson.cl.key 1024

    openssl req -new -key rodrigo.zamoranelson.cl.key -out rodrigo.zamoranelson.cl.csr

    En esta sección, openSSL preguntará lo siguiente:
    Common Name (eg, your name or your server's hostname) []

    Aqui se debe ingresar el dominio exacto del sitio web en el que se usará el certificado, en mi caso, rodrigo.zamoranelson.cl

    openssl x509 -req -in rodrigo.zamoranelson.cl.csr -out rodrigo.zamoranelson.cl.crt -sha1 -CA zamoranelson.cl-ca.crt -CAkey zamoranelson.cl-ca.key -CAcreateserial -days 3650

    openssl x509 -in rodrigo.zamoranelson.cl.crt -text -noout

    En esta sección ya hemos generado y firmado nuestro certificado con la CA zamoranelson.cl para el sitio rodrigo.zamoranelson.cl, el cual será valido también por 10 años.

    CONFIGURACION DE APACHE2

    NameVirtualHost *:443
    < VirtualHost *:443 >
    ServerName powers2.cl
    ServerAlias rodrigo.zamoranelson.cl
    CustomLog /var/log/mcbrain.powers.cl.log full
    DocumentRoot /home/mcbrain
    SSLCertificateFile / etc /apache2/ssl/rodrigo.zamoranelson.cl.crt
    SSLCertificateKeyFile / etc /apache2/ssl/rodrigo.zamoranelson.cl.key
    SSLEngine on
    < /VirtualHost >

    Importante: Esta configuración es Básica y solo ilustrativa. Los espacios en el < VirtualHost > y / etc / apache2 fueron hechos a propósito para evitar problemas con el código de este artículo y deben ser suprimidos.

    Apache en sus configuraciones tiene un parámetro que indica el puerto de escucha, normalmente es el 80, por lo que está definido como Listen 80. En debian está definido dentro del archivo ports.conf, pero en otras distribuciones puede estar en el mismo apache.conf. Para habilitar el puerto 443 tcp, que es el utilizado en https, debemos agregar la linea Listen 443

    En este punto, luego de reiniciar apache2 e ingresar la misma contraseña que usamos al generar los certificados, ya deberíamos poder acceder al sitio.

    Cada vez que se inicie el servicio, como en el paso anterior, se solicitará la clave asignada. Esta característica fue diseñada por razones de seguridad, es necesaria ya que la llave RSA privada del archivo server.key se encuentra encriptada con ella, sin embargo es posible removerla bajo consideración del administrador. Para remover esta capa de seguridad se deben ejecutar los pasos siguientes.

    - mv rodrigo.zamoranelson.cl.key rodrigo.zamoranelson.key.old
    - openssl rsa -in rodrigo.zamoranelson.cl.key.old -out rodrigo.zamoranelson.cl.key

    Enter pass phrase for server.key.orig: **************

    Y luego reiniciar apache2.

    Lo normal es que el navegador nos advierta que el certificado ha sido emitido y firmado por una entidad desconocida, para corregir este problema, llevaremos el archivo antes generado zamoranelson.cl-ca.crt a los clientes que accederán al sitio. Los archivos .crt son una extensión reconocida por los principales sistemas operativos como un certificado digital, por lo que es probable que baste con hacer doble click sobre él para instalarlo dentro de los certificados raíz de confianza del equipo para que los navegadores ya no desconozcan el certificado como uno auto firmado inválido.

    Para evitar este paso, se usan certificados firmados por entidades oficiales como verisign, pero esto tiene un costo asociado.


    Fri Feb 19 22:03:00 2010
     
         
       
     
    Rodrigo Zamora

    Hace unos días comentaba con alguien por ahí, los distintos cambios de voz que ha tenido a lo largo de los años el líder de mi banda favorita.
    Iron Maiden ha venido en varias ocasiones a Chile y en las últimas, mucho pokemón con aires de maldad joven se ha podido delietar con el tema insigne para abrir conciertos, hablamos de Aces High. Creo que los años no han pasado en vano y a pesar que la voz ya no es la misma, Bruce ha podido adaptarla usando técnicas vocales diferentes, es mas, en el presente si que parece Sirena Anti Aérea 8) .

    En el pasado, la voz era bastante distinta y creo que muchos coincidirán conmigo al decir que me hubiese gustado escuchar a Maiden tal como sonaban en la gira World Slavery Tour .

    Centrándome en la interpretación de Aces High y haciendo comparaciones de todas las versiones que he oido ( y que son bastantes ), me quedo lejos con la de Polonia en 1984 .

    En ningún otro concierto he oido el “Ruuuunnnnnnnn….!!! ” de aces high de esta forma ( Debería haberlo conservado así ) .


    Wed Jan 27 17:26:23 2010
     
         
       
     
    Rodrigo Zamora

    Aprovechando los días libres en Santiago, hice lo que quizás hace 6 meses jamás hubiese hecho, ir a un concierto No Metal :D , esta vez fui a ver a “The Cranberries”… Si, lo se, algunos conocidos me dirán mamón te perdiste el concierto de metallica, pero no me interesa, tenía muy buenas razones para ir 8) .

    No soy un seguidor de este grupo, sin embargo algunas canciones las ubicaba, al final, sea como sea, se pasó excelente.

    Todo muy ordenado y salvo problemas técnicos en la mitad del concierto (Se apagaron las pantallas gigantes y la amplificación)) y el final abrupto sin despedida ( Creí que saldría a despedirse pero se fueron rápido ).

    En resumen, buen concierto y sonido, no conocía el recinto y no resultó un mal lugar después de todo, ya que le tenía poca fe a la acústica de un lugar tan cerrado.


    Wed Jan 27 17:00:50 2010
     
         
       
     
    Patricio Perez

    Hola, vengo a escribir el penúltimo articulo del glob del año.

    En la parte del año que fue como las wifas (Como lo pronostique a fines del 2008) le lleva:

    • Me despidieron, el único consuelo es que no fue mi culpa (La empresa murio en mala).
    • Aún me estan alargando el pago de unas lucas (CTMS, mueranse)
    • Par de temas personales que no vale la pena mencionar.
    • Ah, y no pude regalarme nada fancy para navidad :( (Vease el fail del pago de lucas de más arriba)

    Ahora, lo que si me salvo el año :D :

    • Trabaje en lo que me gusta por 8 meses.
    • Aprendí cosas re-entretenidas en la pega.
    • Me lleve genial con un par de clientes (Gabriela y Jordana, tambien Felipe). Lastima que con otros no tanto …
    • Conocí gente genial (Team DM, la gabi, el milton, la veny, el vicho, hasta javier; Ex-DM: el cesar :P ; y el equipo de egipcios, que lo nombro más abajo).
    • Me llevo mejor con gente que antes consideraba solo conocidos :)
    • Trabajé con un dream team para las jornadas (Al hilo tenemos a Rod, Boris, Pancho, lecaros, camila, javier y la revelación del año … pottersys xD)
    • Mención honrosa para el Mozcamp y la gente de Mozilla (Sarah, you rocks)

    Disculpen lo latero, la pesima redacción (Queda en el TODO de 2010) y los daños que les haya provocado el post :D y antes de olvidarlo: Feliz año!


    Thu Dec 31 15:00:53 2009
     
         
       
     
    Matias Fernandez

    … tejo de rayuela


    Fri Dec 18 15:15:12 2009
     
         
       
     
    Patricio Perez

    Git SCM

    Primero que nada, gracias a Cesar por la idea de usar git para backups  de ahi me vino toda esa git mania :D

    Cuando se trata de sistemas de control de versiones, los primeros que se me vienen a la mente son git y subversion, por motivos de laziness prefiero el primero, por que lo conozco mejor y por que puedo hacer este setup con los ojos vendados (Not really :( )

    Bueno, me ahorrare unas lineas diciendo que este setup:

    • Usa llaves ssh para la autenticacion de usuarios
    • Usa un repositorio git para manejar los repositorios de git (Got it?)
    • Solo usa una cuenta de usuario para el manejo de git

    Usaremos el proyecto Gitosis, desarrollado por Tommi Virtanen, como se imaginan el proyecto esta hosteado en git :P

    Nos fuimos:

    Paso 1: Instalar Gitosis

    Instalamos git y setuptools de python:

    apt-get install git-core python-setuptools

    Ahora clonamos el codigo fuente de gitosis y lo instalamos:

    cd /usr/src/
    git clone git://eagain.net/gitosis.git
    cd gitosis
    python setup.py install
    

    Paso 2: Crear el usuario para git

    Creamos el usuario git (puede llamarse como ustedes quieran):

    adduser \
        --system \
        --shell /bin/bash \
        --gecos 'Control de Versiones Git' \
        --group \
        --disabled-password \
        --home /home/git \
        git
    

    Notar que tiene la contraseña deshabilitada, ya que no es necesaria; y tambien que le dimos una shell valida (Que si es necesaria para que ande gitosis).

    Ahora para iniciar la instancia de gitosis, necesitaremos una llave pública RSA, si no tienen una pueden crearla con este comando:

    ssh-keygen -t rsa -C janitux

    Con nuestra llave lista, la copiamos al server que tendra gitosis, e iniciamos finalmente la creacion de la instancia gitosis:

    su -c "/usr/bin/gitosis-init < /tmp/id_rsa.pub" git

    Y este comando por si tenemos un bug en python-setuptools:

    chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

    Y comienza la fiesta, clonamos el repositorio de administracion de gitosis:

    git clone git@SERVER:gitosis-admin.git

    Y ya estamos listos para administrar nuestros repositorios con gitosis! :D

    gitosis admin FTW!

    Paso 3: Crear Repositorios con gitosis

    La administración de gitosis es muy sencilla, basta modificar el fichero gitosis.conf del directorio que clonamos en el paso anterior.
    La sintaxis de este fichero se basa en directivas de grupos, se define el grupo, en que repositorios tendrán permisos de escritura o lectura; para más información sobre gitosis.conf ver el fichero example.conf

    En fin, en este ejemplo crearemos el grupo ?equipo?, con ?pato? y ?pedro? como miembros del grupo y este grupo tendrá permisos de escritura en los repositorios ?mirepo? y ?repob?. (Nota: el nombre de usuario se determina mediante los ficheros en el directorio keydir, es el nombre del fichero, sin la extensión .pub)

    
    [group equipo]
    writable = mirepo repob
    members = pato pedro
    

    Tambien tenemos que agregar las llaves publicas de pato y pedro:

    
    cp id_rsa_pato.pub gitosis-admin/keydir/pato.pub
    cp id_rsa_pedro.pub gitosis-admin/keydir/pedro.pub
    

    Con esto estariamos listos para dar un commit y que se apliquen los cambios:

    git add gitosis.conf keydir/
    git commit -a -m "Creado grupo equipo, con pato y pedro como miembros, y permiso de escritura en los proyectos mirepo y repob"
    git push
    

    Y finally creamos el repositorio con el commit inicial:

    
    mkdir -p ~/Git/mirepo
    cd ~/Git/mirepo
    git init
    git remote add origin git@SERVER:mirepo.git
    ## Hacer trabajos, agregas ficheros con git add, y haces un commit con git commit -a
    git push origin master:refs/heads/master
    

    FINALLY! estamos listos para seguir trabajando con nuestros repositorios git :)

    Mi única recomendación, sean claros con los nombres de sus mensajes en el commit.

    Y obviamente, los creditos van a Garry Dolley, por este howto :D


    Fri Dec 11 05:49:28 2009
     
         
       
     
    Patricio Perez

    Hola, vengo a contarles una pequeña historia, incluye a un cliente puteandome por no poder enviar correos en outlook via GTD y  el antispam avenger.

    La historia comienza cuando me dicen que el cliente XX tiene un problema con el correo, entonces reviso los logs del server y no veo nada extraño, enviaba correos, recibia correos, todo bien! (Revise bien al pedo, por que estaba un poco ocupado en las jornadas)
    Lo que siguio, es que al volver a la vida (Aproximadamente el martes o miercoles, despues de las jornadas), me llama el cliente XX a la oficina, diciendome que ha estado como dos semanas con el problema, que desde su “coso” movil movistar podia enviar correos bien, pero que desde el enlace de <no puedo decir donde estaba> no podia enviar correos. En fin, luego de 5 minutos de tratarme como idiota, me harte y pedi hablar con el encargado del enlace (Mucho más razonable, y realmente entendía lo que yo hablaba :D ). Despues de hacer un par de pruebas, me fije que los logs decian XXXX hostname, en las sesiones de envio SMTP, y claro, ahí saltaba avenger alegando que tenía que hacer primero un EHLO o sino era spam. Hasta ahí no entendia nada, por que diablos desde una conexión si se enviaban bien los comandos SMTP, y no desde otra; tras googlear un rato, encontre al culpable!

    Según vi, los firewalls cisco tienen una función llamada “fixup protocol”, que solo permite que pasen ciertos comandos SMTP, despues de deshabilitarlo, todo volvio a la normalidad :)


    Sat Oct 17 20:27:10 2009
     
         
       
     
    Andres Ovalle

    Hoy en las noticias de Debian han anunciado que va a estar disponible un port del kernel de BSD, Squeeze será la primera rama en incluir el nuevo port.

    The Debian Release Team is pleased to announce that it sees the port of the Debian system to the FreeBSD kernel fit to be handeld equal with the other release ports. The upcoming release codenamed ‘Squeeze’ is planned to be the first Debian distribution to be released with Linux and FreeBSD kernels.

    Link’s

    http://www.debian.org
    Debian pushes development of kFreeBSD port.


    Wed Oct 7 18:49:11 2009
     
         
       
     
    Andres Ovalle

    El Grupo Local de GNOME – GNOME Chile – tiene el agrado de invitar a todos los entusiastas, usuarios y desarrolladores del proyecto GNOME a presentar sus trabajos dentro de la realización del evento del Día GNOME.

    El Día GNOME es el evento de difusión del proyecto GNOME, más grande que se organiza a nivel nacional, y desde el año 2006 que se está realizando en diversas ciudades del país, con el objetivo de promover el uso y desarrollo de este ambiente y sus tecnologías.

    Esta nueva edición del día GNOME, se desarrollará dentro del Décimo Encuentro Linux y se realizará el día Sábado 24 de Octubre en la Universidad Técnica Federico Santa María, Valparaíso, Chile

    Pueden ver mas información en la Lista de Correos de Gnome Chile.


    Tue Oct 6 02:26:02 2009
     
         
       
     
    Andres Ovalle

    Día del Software Libre 2009

    Este Sábado 26 de Septiembre se realizará en varias ciudades de chile, el Día del Software Libre.

    “El Día de la Libertad del Software es un esfuerzo global de educar al público acerca de la importancia de la Libertad del Software y las virtudes y disponibilidad del Software Libre (Free Software). Los equipos locales de todo el mundo organizan eventos cada tercer sábado de septiembre. El último evento involucró más de 200 equipos de todo el mundo. En nuestro país se realizará el 26 de septiembre, debido a la cercanía de las fiestas patrias.”…

    Para esta ocasión DebianChile.cl se hará presente en la sede de Curicó con un Stand, en donde tendremos algunas sorpresas para los asistentes.

    Link’s

    http://www.diadelsoftwarelibre.cl

    UPDATE

    pueden ver algunas imágenes del evento aquí


    Tue Oct 6 02:18:41 2009
     
         
       
     
    Gonzalo Diaz

    Hace algunos días por alguna extraña alineación planetaria, tuve problemas usando kopete, por lo cual… debí recurrir a la otra opción más a mano, pero del lado oscuro: pidgin. Pero gracias a...

    [...]



    Mon Aug 24 22:36:32 2009
     
         
       
     
    Gonzalo Diaz

    En los próximos meses, se vienen importantes eventos en torno al Software Libre. Día del Software libre Es el más próximo. Se realizará en diversos puntos del planeta, el día 19 de septiembre de...

    [...]



    Thu Aug 20 20:57:25 2009
     
         
       
     
    Andres Ovalle

    El Encuentro Linux es un congreso de carácter internacional que convoca a los profesionales e interesados en el sistema operativo Linux, BSD, código abierto y tecnologías afines. Es la máxima instancia en Chile sobre estos temas, y reúne a profesionales, académicos, estudiantes y empresarios para compartir en charlas, tutoriales, debates y otras actividades.

    La presencia y el uso de software basado en código abierto es cada vez mayor, hoy está presente en áreas donde antes no era de uso común. Hoy en día se puede encontrar Linux en una diversa gama de dispositivos: Desde celulares y netbooks, hasta enormes redes sociales que se construyen sobre servidores basados en software código abierto.

    Este año se celebra la décima versión del evento, el cual nació como una instancia para reunir a todos los entusiastas de este sistema operativo y del código abierto. Además, permite acercar y difundir el uso de Linux y el código abierto a la comunidad en general.

    Invitación

    Invitamos desde ya a preparar su trabajo y enviarlo a más tardar el día viernes 03 de julio. Se aceptará el envío de trabajos destinados a charlas o tutoriales (bajo las mismas condiciones). Los trabajos enviados deberán respetar la estructura y limitaciones indicadas en este documento. El envío de los trabajos será vía web, sistema que se habilitará el día 18 de mayo.

    El formato de las charlas será de 50 minutos más 10 minutos adicionales destinados a preguntas.

    Estructura de la propuesta

    1. Título

    2. Autor(es), uno de los cuales debe ser el expositor del trabajo.

    3. Abstract (Resumen): Breve resumen, de no más de 5 líneas, indicando la principal idea de la charla o tutorial.

    4. Keywords (palabras clave)

    5. Introducción

    6. Motivación: Explicación de porqué su trabajo es de interés para el público objetivo de este congreso.

    7. Desarrollo del Tema

    8. Referencias

    9. Área en la que se centra el trabajo (ver sección ?Áreas Temáticas?)

    10. Nivel (Elegir uno de básico, medio o avanzado).

    11. Indicar máximo 5 puntos en los que se enfocará la presentación (no el trabajo).

    12. Foto del expositor (tamaño pasaporte), una breve reseña biográfica de los autores, y la URL de la página personal o blog (si corresponde)

    Condiciones

    Los documentos enviados se publicarán en la página permanente del Encuentro. Deben cumplir las siguientes condiciones:

    * 3 páginas, sin portada.

    * Enviar en formato PDF, independiente del formato de origen.

    * Se sugiere utilizar algunos de los templates que se publicarán en nuestra página web (ODF, Latex2e).

    * Imágenes u otros materiales anexos sólo como apéndice extraordinario, en un máximo de dos páginas.

    * Por cada trabajo se pagará el viaje y la estadía completos para un expositor (si fueran varios autores).

    * Es necesario que el expositor se encuentre presente y participe de las actividades del evento.

    * El material de apoyo del expositor (típicamente diapositivas) deberá entregarse el 20 de octubre.

    Áreas Temáticas

    El Décimo Encuentro Linux tiene como eje transversal al sistema operativo Linux y tecnologías de código abierto. También son aceptados temas que compartan estas filosofías, como por ejemplo composiciones artísticas bajo licencia Creative Commons, sistemas operativos de la línea BSD, entre otros. Algunos temas afines son:

    * Administración de Sistemas

    * Aplicaciones para Celulares

    * Cloud Computing

    * Desarrollo de Software

    * Diseño Multimedia

    * Educación y E-Learning

    * E-Business

    * E-Government

    * Computación de Alto Desempeño (Grid, Cluster, Multicore)

    * Licenciamiento bajo Copyleft y Creative Commons

    * Netbooks

    * Open Hardware

    * Redes Computacionales

    * Redes Sociales y Web 2.0

    * Sistemas Operativos Abiertos (Linux, BSD, y otros)

    * Videojuegos

    Comité de Programa

    * Presidente del Comité: Horst H. von Brand, UTFSM.

    * Delia Ibacache, UPLA.

    * Patricia Trejo, UV.

    * Miguel Ruiz, PUCV.

    * Samuel Pizarro, DuocUC.

    * Arturo A. Hoffstadt, UTFSM.

    * Sven von Brand, UTFSM.

    Fechas Importantes

    La hora límite de todas las fechas, son las 18:00 horas (CLT).

    * Apertura del sistema web para envío de trabajos: 18 de mayo.

    * Fecha límite de entrega: viernes 03 de julio.

    * Publicación de resultados: 07 de agosto.

    * Confirmación de asistencia: 14 de agosto.

    * Envío de diapositivas o material de presentación y versión definitiva del resumen: 20 de octubre.

    * Décimo Encuentro Linux: 22 a 24 de octubre.

    Organizan

    El Décimo Encuentro Linux es organizado por las siguientes instituciones de educación superior:

    * Universidad Técnica Federico Santa María

    * Pontificia Universidad Católica de Valparaíso

    * Universidad de Valparaíso

    * Universidad de Playa Ancha

    * DuocUC

    Contacto

    * Sitio web: http://www.encuentrolinux.cl

    * Correo electrónico: encuentro@inf.utfsm.cl

    * Teléfono: +56 32 2654367.

    llamado a envio de trabajos (pdf)

    llamado a envio de trabajos (txt)


    Fri Jun 12 17:59:25 2009
     
         
       
     
    Alejandro Lopez

    Todo cambia.He vuelto a la normalidad.Si importara...


    Thu May 7 12:00:31 2009
     
         
       
     
    Jose Uribe

    Los laboratorios de Sistema del Area de Computacion se reubicaron en la ex sala Cisco de Zocalo.

    Desde el Miercoles, ya se encuentran operativos tanto para clases o el uso general de los alumnos.


    Fri Apr 17 21:31:42 2009
     
         
       
     
    Alejandro Lopez

    :DEso. Ando feliz.


    Thu Mar 26 23:23:14 2009
     
         
       
     
    Patricio Perez

    Hace unos días tuve un pequeño drama, tenía instalado amsn en una partición con Ubuntu, y necesitaba instalarlo en otro Ubuntu; el problema es que había perdido el deb, y era un build svn de amsn con otros chiches (Ergo, no me daría la paja de bajar el código del svn, buscar plugins extras ni mucho menos instalar las librerías necesarias para compilarlo).

    Aquí es cuando llega dpkg-repack a salvarme, hace exactamente lo que necesitaba.
    La instalación es muy simple, lo instalan vía apt y luego lo corren como root, el único argumento que necesitan es el nombre del paquete.

    Ejemplo: sudo dpkg-repack amsn

    dpkg-repack

    PD: Les conte que ahora estoy usando KDE 4.2? :D

    Now Playing: Pork & Beans – Weezer


    Tue Jan 27 01:11:25 2009
     
         
       
     
    Alejandro Lopez

    Test de inteligencia emocional fail. 1. Consciencia de si mismo = 76% 2. Expresión Emocional = 47% 3. Grado de Autonomia = 62% 4. Confianza en si mismo = 81% 5. Actitud frente a los demás = 30% 6. Capacidad para escuchar = 54% 7. Aptitud para desenvolverse en grupo = 0% 8. Promedio General = 50% No me cuadra.


    Mon Jan 26 15:54:58 2009
     
         
       
     
    Jose Uribe

    Para los alumnos interesados en hacer su practica Profesional, la empresa Emelari esta solicitando un alumno en practica que apoye las funciones del área de informática de su empresa.

    Dicha practica durará 3 meses y se cancelara $100.00 por cada mes.

    Alumnos interesados comunicarse con la Secretaria del Área de Computación e Informática.


    Thu Jan 8 19:29:51 2009
     
         
       
     
    Jose Uribe

    El viernes pasado, se realizó en nuestra dependencias del Área de Computación e Informática, la llamada OSUM Pizza Party, esta actividad fue gestionada por GDSOL ( Grupo de Difusión del Software Libre ) en la cual se tenían que juntar 100 personas en la plataforma OSUM. ( La meta se cumplió en 3 días )

    Aparte de la Pizza Party, se realizó una Charla de información respecto a lo que la empresa SUN, ofrece para los universitarios, desde cursos a certificaciones tanto para el alumnado como académicos.

    Parte del Grupo que participo en OSUM Pizza Party


    Wed Dec 17 21:04:47 2008
     
         
       
     
    Jose Uribe

    Ricardo Spencer Veas

    • “Desarrollo de una Plataforma Web para solucionar la gestión de peticiones de servicios entre las unidades de la Universidad de Tarapacá”
    • P. Guía : Oscar Sagardia O.
    • P. Inf.:    Héctor Ossandón D.
    • Lugar: 04/12/08, A LAS 15:00 HRS. SALA CENTENARIO.

    Diamkel Orellana Madariaga

    • “Definición de un proceso de desarrollo para sitios web basados en el CMS Joomla”
    • P. Guía: Ricardo Valdivia P.
    • P. Inf.:   Héctor Ossandón D.
    • Lugar: 17/12/08, A LAS 8:30 HRS, SALA CENTENARIO


    Mon Dec 1 13:04:56 2008
     
         
       
     
    Jose Uribe

    Hoy se recibió el siguiente correo:
    ==============================
    Se solicita a todos los usuarios de la red informática de la Universidad
    de Tarapacá tomar la debida atención a la situación que se indica a
    continuación:

    Gusano ataca a computadores de todo el mundo

    Desde ayer 27 de noviembre a partir de las 15:30 horas se detecta un
    gusano informático conocido como “conficker” o “downadup”, está atacando
    a los computadores de millones de usuarios. Las consecuencias de su
    ataque es el colapso en la conexión a internet de los usuarios que se
    contagian al acceder a Internet.

    Se sugiere la inmediata instalación de un parche disponible por
    Microsoft (aquellos equipos con licencia legal).

    Como prevenirlo.

    1.-  Actualizar el parche de seguridad que se encuentra informado en el
    Boletín de Microsoft :
    http://www.microsoft.com/spain/technet/security/bulletin/ms08-067.mspx
    sólo vale en equipos con copia legal del windows.

    2.-  Actualice su antivirus y completa la seguridad de tu computador con
    un firewall o sea activar cortafuegos local en el computador personal

    3.-  Apague o desconecte su computador de la red por el momento.

    Ante cualquier situación contactar a dtisopor@uta.cl o al fono 205976, o
    al técnico de soporte informático de su facultad o unidad.

    SOLUCION:

    —–BEGIN PGP SIGNED MESSAGE—–
    Hash: SHA1

    Hola:

    A nivel central se han aplicado reglas de bloqueo ICMP (ping a cualquier
    lado) y bloqueo de los servicio Microsoft para compartir archivo e
    impresoras entre InterRedes. El malware se distribuye por el puerto 445.

    Mantenerse alerta a cualquier evento.

    Aplicar parche sugeridos, verificar que los firewall en lo clientes
    estén activos, borrar todas excepciones en el cortafuegos local y
    comenzar de nuevo a dar los permisos o excepciones.

    Encender o conectar los equipos debido a la situación controlada


    Fri Nov 28 19:35:53 2008
     
         
       
     
    Roberto Carvajal

    A


    Wed May 28 20:56:18 2008
     
         
       
     
    Roberto Carvajal

    A


    Sun May 18 21:25:50 2008
     
         
       
     
    Roberto Carvajal

    A


    Fri May 2 04:13:23 2008
     
         
       
     
    Roberto Carvajal

    A


    Wed Apr 30 08:21:42 2008
     
         
       
     
    Roberto Carvajal

    A


    Sat Apr 19 05:24:27 2008
     
         
       
     
    Matias Fernandez

    Que frustrante, intento jugar al Loto en linea y no puedo.
    Resulta que me inscribí el año pasado para jugar una vez y desde aquel entonces no he vuelto a entrar a dicha página…
    … Hasta ahora, que intenté jugar Loto y no pude debido a:

    • Intento ingresar con mis datos (los cuales tenia guardados en un correo la vez que me registré) y la pagina me indica: Usuario inválido
    • Intento volver a registrarme y la pagina me indica: RUT en uso
    • Intento la opción “¿Olvidaste tu contraseña?” y la página me indica: Ha ocurrido un problema al ingresar su clave
    • Intento pinchar en el link “Contactenos” para pedir ayuda por mi registro y recibo un lindo Error 404

    <ironic>Es increíble lo bien que funciona la pagina de polla…<ironic>
    Siempre este tipo de paginas y sistemas online están hechos por webmasters/programadores/analistas/ingenieros mediocres y nunca funcionan como deberían

    Ya, me descargué…


    Fri Jan 11 18:06:34 2008
     
         
       
     
    Matias Fernandez

     yay!!
    comienzo a bajarlo para tener mis propias conclusiones

    Mas info aquí


    Fri Jan 11 12:39:53 2008
     
         
       
     
    Matias Fernandez


    Lastima que navidad ya paso…

    schop.codemonkey.cl now open!!


    Fri Dec 28 13:59:04 2007
     
         
       
     
    Matias Fernandez

    Y me aburrí de movable type, así que instalé una copia de wordpress para hostear mi blog
    So no mas…


    Sun Dec 9 02:43:07 2007
     
         
       
     
    Andres Salinas


    Wed Dec 31 21:00:00 1969