Monday, August 17, 2020

SQLCIPHER PHP 7.4 UBUNTU

 This took me too much time to implement, after two hours of searching, I didnt found and documentation of how to compile sqlcipher support of ext/sqlite3 of php.

I also posted this to a gist in my github: https://gist.github.com/durich/bf15c091c6d59b042caa142950eaf252

 

So I'm posting my recipe to compile sqlcipher support to the ext-sqlite3 of php, any recommendations to refined this process is welcome:




#this is for php  7.4 included in distro, may work in other versions of php 7
#install library
apt-get install php7.4-dev build-essential

#download and compile sqlcipher
cd /usr/local/src/
git clone https://github.com/sqlcipher/sqlcipher

#compile
cd sqlcipher

./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
make

#download php
cd /usr/local/src/
wget https://www.php.net/distributions/php-7.4.9.tar.bz2

#extract files
tar -xvjf php-7.4.9.tar.bz2

#enter directory
cd php-7.4.9/ext/sqlite3

#run phsize
phpize

#copy m4 file
mv config0.m4 config.m4

#run configure
SQLITE_LIBS="/usr/local/src/sqlcipher/.libs/" SQLITE_CFLAGS="-I/usr/local/src/sqlcipher/ -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2" ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypt -L/usr/local/src/sqlcipher/.libs/"  --libdir=/usr/local/src/sqlcipher/.libs/sqlite3.o

#run make
make

#check module file sqlite3.so, if less than 110,000 byes, sqlcipher not included
ls -l modules/ -l

#another to check
strings modules/sqlite3.so | grep  sqlcip

#include /usr/local/src/sqlcipher/.libs/sqlite3.o in the linking, this step is extra,  because I'm noob on configure flags and c++ flags, suggestion are welcome
vim sqlite3.lo

#change line
pic_object='.libs/sqlite3.o'

#to
pic_object='.libs/sqlite3.o /usr/local/src/sqlcipher/.libs/sqlite3.o'

#save file

#execute again
make

#check, if greateher thank 110,000 bytes, it linked ok
ls -l modules/ -l

#check strings, should be alot of functions
strings modules/sqlite3.so | grep cip

#copy compiled module tu modules, in php7.4 case the directory is /usr/lib/php/20190902/
cp modules/sqlite3.so /usr/lib/php/20190902/

#crear  ini files to load in fpm, apache or cli, my case is cli and fpm
echo extension=sqlite3.so > /etc/php/7.4/cli/conf.d/20-sqlite3.ini
echo extension=sqlite3.so > /etc/php/7.4/fpm/conf.d/20-sqlite3.ini

#test php should giver versions in $version->fetchArray
query("PRAGMA cipher_version");
if($version){
     var_dump($version->fetchArray());
} else {
    throw new Exception($db->lastErrorMsg());
 }
$db->exec("PRAGMA key = '$password';");
$db->exec("PRAGMA cipher_page_size = 1024;");
$db->exec("PRAGMA kdf_iter = 64000;");
$db->exec("PRAGMA cipher_hmac_algorithm = HMAC_SHA1;");
$db->exec("PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA1;");

Wednesday, April 2, 2014

Cursores con JDBC y Postgres

Se ocupa utilizar cursores al momento de realizar una consulta en una tabla grande, antes de utilizar cursores se debe cumplir los siguientes condiciones:

1. Servidor debe de usar el protocolo V3.

2. La conexión no debe de estar en autocommit;

conn.setAutoCommit(false);

3. El tipo de Resultset debe de ser ResultSet.TYPE_FORWARD_ONLY

4. La consulta debe de ser de sola sentencia.

Sunday, August 4, 2013

Utilizar PHP AWS SDK 2 con Ceph

Como se describió en el artículo pasado, estoy utilizando Ceph como almacén de objetos para proyectos internos.

Al utilizar Ceph nos da la ventaja de poder utilizar herramientas hechas para el Api de Amazon S3 en nuestros proyectos, pero se deben de instanciar de manera especial para que puedan conectarse a su Servicio Compatible de S3.

Nuestro servicio no brinda soporte de acceso a los buckets a través de Subdominios, por lo que al momento de Instanciar, se debe de cambiar el End Point y el estilo de acceso.

Al momentos de Crear la instancia del Cliente

$client = S3Client::factory(array(
    'key'    => '<ACCESS KEY>',
    'secret' => '<SECRET KEY>',
    'base_url' => 'https://objectos.ejemplo.com',
    'ssl.certificate_authority' => false,
    'curl.options' => array(CURLOPT_SSL_VERIFYPEER => 0)
  

));



Al momentos de Crear un Bucket

$result = $client->createBucket(array(
        'Bucket' => $bucket,
        'PathStyle' => TRUE
    ));
Al momentos de Subir Un Archivo

$result = $client->putObject(array(
        'Bucket'     => $bucket,
        'Key'        => $key,
        'SourceFile' => $pathToFile,
        'Metadata'   => array(
            'Foo' => 'abc',
            'Baz' => '123'
        ),
        'PathStyle' => TRUE,
        'ACL'        => CannedAcl::PUBLIC_READ
    ));

Cambios en S3Cmd para su uso en Servicios Compatibles de Amazon S3

Para un proyecto hemos instalado Ceph, un sistema de archivos distribuidos que tiene un servicio de Almacenamiento de Objetos con un interfaz compatible con el Api de Amazon S3.

Amazon utiliza dos formas para acceder los buckets en S3, si por ejemplo, se tiene el bucket demoprueba, este puede ser accedido como:

  • https://demoprueba.s3.amazonaws.com 
  • https://s3.amazonaws.com/demoprueba
La primera es la forma preferida de Amazon y de las herramientas que se han desarrollado alrededor de este servicio.

En el caso nuestro al utilizar Ceph, tenemos las dos opciones, pero la opción de usar subdominios por bucket nos brinda un problema ya que no contamos con certificados para cada subdominio o certicados wildcard.

Por lo que hemos optado a utilizar la segunda opción, https://objetos.ejemplo.com/demoprueba.

Al ultizar esta opción nos da un problemas porque existen varias herramientas donde no utilizan esta opción como defecto y se debe de instanciar de otra forma los clientes o se deben de hacer cambios en el código.

Tuvimos un problema para utilizar S3Cmd en nuestro servicio, los desarrolladores no dan la opción de cambiar el estilo de acceso a S3 en su archivo de configuración por lo que se debe de modificar una línea para que sea compatible con nuestro servicio.


Este es el cambio que se hizo a la clase S3/S3.py para que sea compatible con Ceph.


214c214
<         if resource['bucket'] and not check_bucket_name_dns_conformity(resource['bucket']):
---
>         if resource['bucket'] :
217a218,219
>
>

Sunday, March 3, 2013

Calculando el punto medio entre dos coordenadas

Para encontrar el punto medio de dos coordanadas, tomando como referencia esta pagina movable-type.co.uk


public static void midPoint(double lat1,double lon1,double lat2,double lon2){

    double dLon = Math.toRadians(lon2 - lon1);

    //convert to radians
    lat1 = Math.toRadians(lat1);
    lat2 = Math.toRadians(lat2);
    lon1 = Math.toRadians(lon1);

    double Bx = Math.cos(lat2) * Math.cos(dLon);
    double By = Math.cos(lat2) * Math.sin(dLon);
    double lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By));
    double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx);

    //print out in degrees
    System.out.println(Math.toDegrees(lat3) + " " + Math.toDegrees(lon3));
}

Monday, February 11, 2013

Symfony 2 - Ignorar Campos Vacios en Formas

Estoy creando un administrador de cuentas y usuarios usando Symfony 2.1 y el Proyecto Sonata, un requerimiento es que al momento de actualizar una cuenta, si el usuario no introdujo una contraseña la aplicación debe de ignorar este campo y no actualizarlo en la base de datos.

Para realizar esto, se debe de utilizar una clase que implemente la interfaz EventSubscriberInterface y suscribirla al objeto de la Forma en el evento PRE-BIND, luego esta verificará si el usuario no envió valor al campo, si es asi se eliminará el campo para que no sea considerado al momento de la actualización.

Mas Información
Asociarlo al objeto en sonata:
protected function configureFormFields(FormMapper $formMapper)
{

///BLLA
////.....
$subscriber = new IgnoreBlankFieldListener($formMapper->getFormBuilder()->getFormFactory(), 'password');
            
$formMapper->getFormBuilder()->addEventSubscriber($subscriber);

//SEGUIR
}
Este es la clase que utilice que cree, sirve para objetos normales o arreglos.
namespace Acme\TestBundle\Admin;
 
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
class IgnoreBlankFieldListener implements EventSubscriberInterface
{
    private $factory;
    private $name;
 
    public function __construct(FormFactoryInterface $factory, $name)
    {
        $this->factory = $factory;
        $this->name = $name;
    }
    
    public static function isNotEmpty($var )
    {
        if(is_array($var))
        {
            $notempty = false;
            
            foreach( $var as $v )
            {
                $notempty = $notempty || !IgnoreBlankFieldListener::isNotEmpty($v);
            }
            
            return $notempty;
        }
        else
            return !empty ($var);
    }
    
    public static function isEmpty( $var )
    {
        
        return IgnoreBlankFieldListener::isNotEmpty($var);
    }
 
    public function preBind(FormEvent $event)
    {
        
        $data = $event->getData();
        $data_name = $data[$this->name];
        
        
        
        if( IgnoreBlankFieldListener::isEmpty($data_name) )
        {
           $form = $event->getForm();
           unset( $data[$this->name] );
           $event->setData($data);
           $form->remove($this->name);
        }
    }

    public static function getSubscribedEvents() {
        
        return array(FormEvents::PRE_BIND => 'preBind');
    }
}

Tuesday, January 29, 2013

Calculando el centro de varias coordenadas geograficas en Java

Ocupaba sacar el centro de varias coordenadas en Java y encontre este articulo. Según los comentarios, es probable que de error en ciertos casos, pero para puntos muy cercanos no hay problema.
public static latlon GetCentrePointFromListOfCoordinates(List coordList)
{
    int total = coordList.size();

    double X = 0;
    double Y = 0;
    double Z = 0;

    for( idleperfromance i : coordList)
    {
        double lat = i.getLat() * Math.PI / 180;
        double lon = i.getLon() * Math.PI / 180;
         
        double x = Math.cos(lat) * Math.cos(lon);
        double y = Math.cos(lat) * Math.sin(lon);
        double z = Math.sin(lat);

        X += x;
        Y += y;
        Z += z;
    }

    X = X / total;
    Y = Y / total;
    Z = Z / total;

    double Lon = Math.atan2(Y, X);
    double Hyp = Math.sqrt(X * X + Y * Y);
    double Lat = Math.atan2(Z, Hyp);
    return new latlon(Lat * 180 / Math.PI, Lon * 180 / Math.PI);
}

class latlon
{
    double lat;
    double lon;

    public latlon(double lat, double lon)
    {
        this.lat = lat;
        this.lon = lon;
    }

    public double getLon() { return lon; }
    public double getLat() { return lat; }
}

SQLCIPHER PHP 7.4 UBUNTU

 This took me too much time to implement, after two hours of searching, I didnt found and documentation of how to compile sqlcipher support ...