arquivo

Arquivo da tag: programming

Hello friends!

Look on the internet a alternative way to upload files on Amazon S3 without AWS-SDK and then you will know that is a dificult thing for many; Wait a second, why someone will need to use S3 without the Amazon SDK? That’s the problem! We all know that sometimes you can’t do simple a import/require in some lib written by another guy/girl to turn things to into a easy way. That’s the beauty of an challenge.

So to win that, all you need to do is read two docs of Amazon:

The first documentation describes how you handle the HTTP PUT using simple REST and the second describes how to implements the Amazon signature based on AWS_ACCESS_KEY and AWS_SECRET_KEY;

Backing to the problem, days ago in my work we need to face this problem: the development version of a framework that we use can’t import AWS-SDK into project and after the mess that this problem caused, it make me think in do this post on blog;

I was already do it a year ago using shell-script when I need to automatize a build process of MacOS to send the .IPA into S3, so I start to do some changes in code and finally written two new version: one in shell script and other in node.js; The principal problem found, the root of many problems to some guys is the signature process, as described on Amazon docs all you need to sign is:

HTTP-RESOURCE
MD5_BASE64_HASH
mimetype
DateInIsoUTCTime
someHeadersOfAmazon
fullPathOfObjectFile
  • HTTP-RESOURCE is just the HTTP REQUEST TYPE: PUT/GET..
  • MD5_BASE64_HASH is one of the tricks of Amazon Doc (bad trick)
  • mimetype i just use application/octet-stream works for all types of file
  • DateInIsoUTCTime like -> Wed, 26 Oct 2016 12:09:45 +0000
  • someHeadersOfAmazon extra header of Amazon that you need to pass
  • fullPathOfObjectFile /yourBucketName/dir1/subdir2/yourFile.jpg

Or in resume:

PUT
YUORQaKyyJWlorHlFqBtCQ==
application/octet-stream
Fri, 25 Nov 2016 14:27:42 +0000
x-amz-acl:public-read
/2e8dae9c-aad2-4d10-8abc-a7e24d80b4af/darwinorigins.jpg

If you type one character byte wrong then your signature will receive the error below when you try to send your file:

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AKIAIJ5QILNVUULONEGQ</AWSAccessKeyId>

So, later I will post more details here if someone needs and also the node.js code using just the builtin libs: crypto, fs, https and buffer; until then that’s the cURL version

And the node.JS version, using just native modules;

Hope it helps someone! 🙂

Dona Fernanda resolveu casar-se com Carlos, o padre porém disse que os noivos não poderiam escolher a data de casamento devido a grande quantidade de solicitações na igreja. Vários noivos também estavam ansiosos para saber quando poderiam se casar naquela linda igreja, para dizer a cada casal o dia exato em que eles poderiam se casar o padre solicitou que eles fornecessem de 1 até 5 dias no mês de sua preferência e desenvolveu um algoritmo que ajudaria a resolver este impasse de forma aleatória e justa agora e no futuro, ele definiu:

  • T – quantidade de casamentos na fila
  • M – mês do casamento
  • N – quantidade de dias do mês disponível
  • Vx – Valor do dia na posição X (V1, V2, V3…)

ENTRADA VÁLIDA

T
N V1 V2 V3 … Vx
M

Cada linha corresponde a uma entrada do casal, então se T for igual 10, existiriam 10 casais para casar na igreja em determinado mês, e por consequência, haveriam 10 linhas de entrada informando os dias preferidos do casal.

POR EXEMPLO

5
5 2 7 5 8 14
5 2 4 14 8 15
1 4
0
3 2 7 9
2

RESTRIÇÕES

T > 0 && T <= 20
M > 0 && M <= 12
N > 0 && N <= 5
V > 0 && V < 32 

  • O dia a ser escolhido deve ser o menor do grupo
  • Caso um casal tenha selecionado um dia já escolhido por outro ele ficará com o próximo dia possível, se houver (por exemplo, A = 4 = { 1, 3, 4, 6 } se os dias 1, 3 e 4 já tiverem sido escolhidos, o casal poderá tentar o próximo item, o quarto número, o dia 6), mas precisa ser sempre o menor número do grupo.
  • Em caso de não haver outro dia disponível para o casal deverá ser escrito:
    • “O casal número N só pode casar no próximo mês pois já tem um casal nos dias selecionados”

  • Em caso de violação de restrição deverá ser escrito
    • “Padre, foi encontrado uma inconsistência nos dados.”

RESPOSTA VÁLIDA / SAÍDA VÁLIDA

Padre, são 5 Casamentos em Fevereiro
O casal número 1 ficou de casar no dia 2 de Fevereiro
O casal número 2 ficou de casar no dia 4 de Fevereiro
O casal número 3 só pode casar no próximo mês pois já tem um casal nos dias selecionados
Padre, foi encontrado uma inconsistência nos dados.
O casal número 5 ficou de casar no dia 7 de Fevereiro

EXPLICAÇÃO DA SAÍDA

“Padre, são 5 casamentos em Fevereiro”
 é o número T de casamentos de entrada e o mês M da entrada

“O casal número 1 ficou de casar no dia 2 de Fevereiro”
é o primeiro casal que tem os dias N = {2, 7, 5, 8, 14} disponíveis e o menor possível é o dia 2 de Fevereiro

“O casal número 2 ficou de casar no dia 4 de Fevereiro”
 é o segundo casal que tem os dias N = {2, 4, 14, 8, 15} disponíveise o menor possível é o dia 4 de Fevereiro

“O casal número 3 só pode casar no próximo mês pois já tem um casal nos dias selecionados”
é o terceiro casal que tem os dias N = {4} disponíveis mas como já existia um casal com o dia 4, não é possível realizar o casamento

“Padre, foi encontrado uma inconsistência nos dados do casal 4.  :(”
é a mensagem de erro em caso de violação de restrição

“O casal número 5 ficou de casar no dia 7 de Fevereiro”
é o quinto casal que tem os dias N = {2 7 9} disponíveis e o menor possível é o dia 7 de Fevereiro

MAIS TESTES PARA VALIDAÇÃO

Gerador de testes aleatórios válidos

bash$ ( T=$(( (RANDOM % 20) + 1 )); echo $T; \
for i in `seq 1 $T`; \
do N=$(( (RANDOM % 5) + 1 )) ; echo -n "$N "; \
for x in `seq 1 $N`; do V=$(( (RANDOM % 31) + 1)); echo -n "$V "; done; \
echo; done; echo $(( (RANDOM % 12) +1 )) )

Teste #01

5
5 21 26 4 1 15 
5 19 11 7 16 17 
1 28 
4 29 6 21 25 
1 11 
5

Teste #02

3
3 28 26 7 
2 29 16 
3 8 14 15 
4

Teste #03

5
3 17 31 16 
1 15 
1 7 
4 31 30 12 1 
2 20 27 
3

Teste #04

18
1 21 
3 23 24 5 
5 15 11 19 28 8 
5 11 9 16 16 5 
1 4 
1 4 
4 4 8 7 26 
4 23 12 11 28 
1 7 
2 28 27 
3 27 13 31 
3 30 29 11 
5 2 5 10 20 14 
5 4 16 5 17 25 
2 3 20 
2 17 2 
5 19 21 2 24 25 
5 16 8 18 23 28 
5

Teste #05

11
5 7 19 30 2 22 
3 8 23 30 
5 25 4 16 17 31 
3 18 31 14 
3 6 3 19 
2 20 1 
2 27 22 
2 16 19 
4 9 28 18 21 
2 10 20 
2 29 9 
7

Quer ver a minha versão com entradas e saídas funcionando??
http://pastebin.com/VvbxBZWD

Conseguiu resolver? Poste suas respostas nos comentários! Quer saber a solução? Entre em contato comigo ou procure na lista de Shell-Script a thread “Desafio Shell-Script #001 do Mulato” 😉

Unfortunately we all know that we can’t put everything what we are working in, on a simple blog, I have to understand this since years ago when I worked at some government department. But I can show what I am doing now just for fun and for registry to me in the future.

we were had some problems here, especially when we’d need to try validate a lot of forms that involved things like UITextField, UISegmentedControl, etc. To solve this issue I had to create one class with methods like:

.insert(object, checkType, labelError, errorMessage) // magic goes here.
.showErrors() // print on screen all erros like below
.count() // return the quantity of erros below
.result() // return if all tests are passed or no.

and the code is easily readable:

@IBAction func onActAll(sender: AnyObject)
{
    if ruleThis.result() == false {
        ruleThis.showErrors()
    } else {
        print("Do your segueway or something after success.")
    }
}

(You set a trigger for validation, here a button to Next Screen)

Then you assign function pointers to the stack os Validations.

override func viewDidLoad() {
    super.viewDidLoad()

    ruleThis.insert(object: textFieldCPF,
        function: checkIfCPFisValid, errorLabel: labelMessageCPF,
        errorMessage: "CPF inválido, sua mensagem personalizada aqui.")

    ruleThis.insert(object: textFieldPassword, 
        function: checkIfPasswordIsValid, errorLabel: labelMessagePassword,
        errorMessage: "Sua senha não preenche os resquisitos mínimos de segurança, tente novamente")

    ruleThis.insert(object: textFieldInputCEP, 
        function: checkIfCEPisValid, errorLabel: labelMessageCEP, 
        errorMessage: "Este CEP não é válido")

    ruleThis.insert(object: segmentedOption,
        function: checkIfIsSelected, errorLabel: labelMessageSegmented,
        errorMessage: "Por favor selecione uma das opções.")
}

Then you make a function validation to the object assigned. This coule be simple as

func checkIfTextIsBlank(obj: AnyObject?) -> Bool
{
    var result = false
    
    if let object = obj as? UITextField {
        if !object.text!.isEmpty { // if is not nil.
            result = true
        }
    }

    return result
}

or a little more complex like this (a validation check for social number in Brazil), and the results are below:

validating screen in iOS with Swift

validating screen in iOS with Swift

For me the results are cool and work! I really enjoy work with Swift. 🙂

Some days ago I began to work with Swift, the new programming language of Apple, and iOS! Some people even said that I betrayed the movement! LOL! Really, I feel a little sad to let the open source projects in background for a time but for other side I am really motivated to work with new things and learn new technologies.

Swift is a mix of the best of programming languages, she have tuples, dictionaries, nested functions and little new concepts like optionals! I am really enjoying learning a lot with my new tech friends and really liking the new spirit of innovation that surrounds here.

Some basic tips of Swift:

– Variables are generic but you also can put his value type.

– You need ‘let’ or ‘var’ to declare one variable.
let something: String = “This is a immutable string”
var somethingOther = “This is a muttable string”

– Enums can be almost anything not just only numbers.

– Cases in switch can do amazing things like compare if value is some value type or another.

– Default parameters in functions are awesome like in Python!

– Doing for-loops are very fun!
for i in 1..<someVariable.count { makeWhatYouNeed() }

– Lazy properties are crazy and useful
private var someNasty: String
var usefulThing:String { get { return someNasty } set { someNasty = usefulThing } }

It’s easy create some fun to a nerdy guy! For the first time in my life, I have to thank to Apple for this!

Então depois de alguma leitura e uns testes com o protocolo OAuth2, decidi partir para minha biblioteca utilizando a Google Drive API. Pretendo colocá-la em alguns projetos pessoais com o Simple File Manager mas antes precisava fazer o básico que era a conexão SSL com o servidor, tive como base a documentação do OpenSSL que não é lá essas coisas e ficou assim:

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <openssl/rand.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

#define BUF_MAX 4096

typedef struct {
    int socket;
    char *hostname;
    SSL *ssl;
    SSL_CTX *ssl_ctx;
} conn;

int mlt_handle(char *servname)
{
    int ret, soq;
    struct hostent *host;
    struct sockaddr_in server;

    host = gethostbyname (servname);
    if ((soq = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
        perror ("Socket");
        return -1;
    }

    server.sin_family = AF_INET;
    server.sin_port = htons (443);
    server.sin_addr = *((struct in_addr *) host->h_addr);

    if ( ( ret = connect(soq, (struct sockaddr *)&server, 
                    sizeof(struct sockaddr)) ) == -1 ) {
       perror ("Connect");
       return -1;
    }

    return soq;
}

conn *mlt_ssl_connect(char *servname)
{
    conn *p;

    p = (conn *)malloc(sizeof(conn));
    p->ssl = NULL;
    p->ssl_ctx = NULL;
    p->hostname = servname;

    SSL_load_error_strings ();
    SSL_library_init ();

    if ( (p->socket = mlt_handle(p->hostname)) == -1)
        return NULL;

    if ( (p->ssl_ctx = SSL_CTX_new(SSLv23_client_method ())) == NULL)
        ERR_print_errors_fp (stderr);

    if ( (p->ssl = SSL_new(p->ssl_ctx)) == NULL)
        ERR_print_errors_fp (stderr);

    if (!SSL_set_fd(p->ssl, p->socket))
        ERR_print_errors_fp (stderr);

    if (SSL_connect(p->ssl) != 1)
        ERR_print_errors_fp (stderr);

    return p;
}

void mlt_disconnect(conn *p)
{
    SSL_shutdown(p->ssl);
    close(p->socket);

    SSL_free(p->ssl);
    SSL_CTX_free(p->ssl_ctx);

    free(p);
}

int mlt_ssl_read(conn *p, char *buffer)
{
    int bytes;

    memset(buffer, '', BUF_MAX);
    bytes = SSL_read (p->ssl, buffer, BUF_MAX-1);

    return bytes;
}

int mlt_ssl_write(conn *p, char *cmd)
{
    int ret;

    ret = SSL_write(p->ssl, cmd, strlen(cmd));

    return ret;
}

int main (int argc, char **argv)
{
    conn *server;
    char buffer[BUF_MAX];
    int bytes;

    server = mlt_ssl_connect("www.google.com");

    mlt_ssl_write(server, "GET /rnrn");

    while (1)
    {
        bytes = mlt_ssl_read(server, buffer);
        if (!bytes) {
            fprintf(stderr, ".-. server disconnected.n");
            mlt_disconnect(server);
            break;
        }

        fprintf(stdout, "%s", buffer);
   }

    return 0;
}

Tô feliz com o resultado até agora e estou começando a melhorar minha api pra o google drive que breve devo metê-la no github 😉

Bom, finalmente terminei a minha faculdade de rede de computadores e decidi voltar ao que fazia antigamente: programar, para me esforçar a finalmente aprender java decidi me inscrever num ensino a distância do coursera de algoritmos, lá o professor diz que a linguagem utilizada para desenvolver os exercícios é Java então não tem pra onde correr.

Espero que seja proveitoso, é o meu segundo curso de ensino a distância que faço e estou muito empolgado com os professores e a possibilidade de aumentar mais as minhas habilidades.

Voltando a programar bem depois de um tempo parado fazendo apenas scripts, resolvi adicionar suporte no meu gerenciador de arquivos ao samba e o ssh, por enquanto o ssh tá apenas na lista de estudos e pendências, mas o suporte ao samba já está virando uma realidade como pode ser visto abaixo. Clicando aqui você pode vêr o código do fonte se quiser maiores detalhes do algoritmo.

Fazendo algumas alterações para demonstração temos isso aqui.

$ gcc -o libsmb libsmb.c -lsmbclient

Listando a rede samba em busca de grupos de trabalho:

$ ./libsmb list smb://
wee!! cmd 'list' host 'smb://'
1, grupo de trabalho,	MULATINHO

Opa! Existe um grupo de trabalho na rede chamado ‘MULATINHO’, vamos vê-lo:

$ ./libsmb list smb://MULATINHO
wee!! cmd 'list' host 'smb://MULATINHO'
2, maquina,	FERNANDA
2, maquina,	FORREST

Hmmm, duas máquinas na rede, vamos examinar o ‘FORREST’

$ ./libsmb list smb://FORREST
wee!! cmd 'list' host 'smb://FORREST'
3, compartilhamento,	multimedia
3, compartilhamento,	tmp
6, desconhecido,	IPC$
4, impressora,		HP

E esse diretório compartilhado chamado ‘multimedia’?

$ list smb://FORREST/multimedia
wee!! cmd 'list' host 'smb://FORREST/multimedia'
7, diretorio,	.
7, diretorio,	..
8, arquivo,	sparks-reddawn2012-xvid.avi
8, arquivo,	The.Campaign.EXTENDED.DVDRip.XviD-COCAIN.avi
8, arquivo,	psig-ted.2012.dvdrip.xvid.ac3.srt
7, diretorio,	Madagascar.3.Europes.Most.Wanted.2012.DVDRip.XViD-PLAYNOW
8, arquivo,	O Melhor dos Trapalh_es na TV Volume 2--lJsjEr3pWg.mp4

Hmm.. tava querendo essa legenda do filme TED, vamos baixá-la!

$ ./libsmb recv smb://FORREST/multimedia/psig-ted.2012.dvdrip.xvid.ac3.srt
wee!! cmd 'recv' host 'smb://FORREST/multimedia/psig-ted.2012.dvdrip.xvid.ac3.srt'
file 'psig-ted.2012.dvdrip.xvid.ac3.srt' is written in localhost.

Aqui você pode ver o arquivo baixado corretamente.

$ ls -l psig-ted.2012.dvdrip.xvid.ac3.srt 
-rw------- 1 mulatinho mulatinho 106496 May  4 21:41 psig-ted.2012.dvdrip.xvid.ac3.srt

Tudo isso apenas usando a libsmbclient que vem junto ao pacote do samba. 🙂
Vejo vocês depois!

%d blogueiros gostam disto: