Shared posts

17 Oct 19:46

Hands On: Shared Libraries no Linux

by Augusto Campos

Enviado por Marcos Paulo de Souza (marcos·souza·orgΘgmail·com):

“Bibliotecas compartilhadas são usadas em qualquer sistema operacional, seja Windows, Linux, Mac OSX ou qualquer *BSD ou *NIX. No Windows este recurso tem o nome de DLL (Dynamic-link Library) com sua extensão .dll e nos sistemas UNIX-like este se chama Shared Object e tem extensão .so. Um entendimento básico sobre o funcionamento deste recurso ajuda muito usuários destes sistemas a resolverem possíveis problemas de falta de bibliotecas.” [referência: butecopensource.wordpress.com]

O artigo "Hands On: Shared Libraries no Linux" foi originalmente publicado no site BR-Linux.org, de Augusto Campos.

16 Oct 17:54

Payal Singh: Changing Owner of Multiple Database Objects

A while ago a got a task to change the owner of a group of functions. While the number of functions wasn't too high, it was still enough that I began looking at ways to change the owner in a batch, instead of having to manually change it for each function.
In case of other database objects, changing owners is fairly simple. It can be accomplished in two steps:

1. Get list of all tables/sequences/views:

payal@testvagrant:~$ psql -qAt -c "SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' OWNER TO new_owner;' FROM pg_tables WHERE schemaname = 'payal'" > test.txt

This will give us the following file:

payal@testvagrant:~$ cat test.txt
ALTER TABLE payal.new_audit_users OWNER TO new_owner;
ALTER TABLE payal.v_count_states OWNER TO new_owner;
ALTER TABLE payal.test OWNER TO new_owner;
ALTER TABLE payal.old_audit_users OWNER TO new_owner;
ALTER TABLE payal.old_audit OWNER TO new_owner;
ALTER TABLE payal.adwords_dump OWNER TO new_owner;
ALTER TABLE payal.affiliate OWNER TO new_owner;
ALTER TABLE payal.new_affiliate OWNER TO new_owner;
ALTER TABLE payal.partest OWNER TO new_owner;
ALTER TABLE payal.audit_test OWNER TO new_owner;
ALTER TABLE payal.batatawada OWNER TO new_owner;
ALTER TABLE payal.dup_key_err OWNER TO new_owner;
ALTER TABLE payal.new_audit OWNER TO new_owner;

2. Now all that is needed is to run this file with psql:

payal@testvagrant:~$ psql < test.txt
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE


That simple! An alternate solution can be found here.

However, things get a little tricky with functions due to argument specifications. Basically, one needs to specify a function's arguments along with the function name to alter it. For example:

ALTER FUNCTION hstore.tconvert(text, text) OWNER TO hstore;

Using the method described above to changed owner for tables, you cannot get the function arguments from pg_proc. Instead, postgres has a function pg_get_function_identity_arguments(func_oid) that RhodiumToad told me about in #postgresql IRC channel. This function returns all arguments of a function. So, we can run a query like:

payal@testvagrant:~$ psql -qAXt -c "select 'ALTER FUNCTION ' || n.nspname || '.' || p.proname || '(' || pg_catalog.pg_get_function_identity_arguments(p.oid) || ') OWNER TO hstore;' from pg_proc p, pg_namespace n where p.pronamespace = n.oid and n.nspname = 'hstore'" -o alterfunctions.sql postgres

Which gets a list of all functions in the hstore schema with arguments:

payal@testvagrant:~$ tail -10 alterfunctions.sql
ALTER FUNCTION hstore.ghstore_compress(internal) OWNER TO hstore;
ALTER FUNCTION hstore.ghstore_decompress(internal) OWNER TO hstore;
ALTER FUNCTION hstore.ghstore_penalty(internal, internal, internal) OWNER TO hstore;
ALTER FUNCTION hstore.ghstore_picksplit(internal, internal) OWNER TO hstore;
ALTER FUNCTION hstore.ghstore_union(internal, internal) OWNER TO hstore;
ALTER FUNCTION hstore.ghstore_same(internal, internal, internal) OWNER TO hstore;
ALTER FUNCTION hstore.ghstore_consistent(internal, internal, integer, oid, internal) OWNER TO hstore;
ALTER FUNCTION hstore.gin_extract_hstore(internal, internal) OWNER TO hstore;
ALTER FUNCTION hstore.gin_extract_hstore_query(internal, internal, smallint, internal, internal) OWNER TO hstore;
ALTER FUNCTION hstore.gin_consistent_hstore(internal, smallint, internal, integer, internal, internal) OWNER TO hstore;

Now we can just run this file with psql:

payal@testvagrant:~$ psql < alterfunctions.sql
ALTER FUNCTION
ALTER FUNCTION
ALTER FUNCTION
ALTER FUNCTION
ALTER FUNCTION
ALTER FUNCTION
ALTER FUNCTION
ALTER FUNCTION
ALTER FUNCTION
ALTER FUNCTION
ALTER FUNCTION
ALTER FUNCTION



13 Oct 00:22

Shaun M. Thomas: On PostgreSQL Logging Verbosity

Recently I stumbled across a question on Reddit regarding the performance impact of using pgBadger on an active database server. The only real answer to this question is: do not use pgBadger. Before anyone asks—no, you shouldn’t use pgFouine either. This is not an indictment on the quality of either project, but a statement of their obsolescence in the face of recent PostgreSQL features.

One of the recommended postgresql.conf changes for both of these tools is to set log_min_duration_statement to 0. There are a few other changes they require to put the log entries in the correct format, but we can worry about those later. For now, let’s focus on a little innocent math.

One of the PostgreSQL servers I work with, processes almost two billion queries per day. Let’s imagine every such query is very simple, even though this is definitely not the case. Consider this an example query:

SELECT col1, col2 FROM my_table WHERE id=?

Assuming the query is paramterized, and the number is from one to a million, our average query length is 47 characters. Let’s just say it’s 50 to keep things easy. If we multiply that by two billion, that’s 100-billion bytes of logged SQL. Seen another way, that’s 93GB of logs per day, or about 1MB of log data per second.

In practice, such a short query will not constitute the bulk of a PostgreSQL server’s workload. In fact, if even a simple ORM is involved, all queries are likely to be far more verbose. Java’s hibernate in particular is especially prone to overly gratuitous aliases prepended to all result columns. This is what our query would look like after Hibernate was done with it:

SELECT opsmytable1_.col1, opsmytable1_.col1
  FROM my_table opsmytable1_
 WHERE opsmytable1_.id=?

If we ignore the whitespace I added for readability, and use values from one to a million, the average query length becomes 99. Remember, this is ignoring all useful data PostgreSQL would also be logging! There are also a number of other problems with many of my operating assumptions. It’s very unlikely that query traffic will be consistent, nor will the queries themselves be so short. In addition, I didn’t account for the length of the log prefix that should contain relevant metadata about the query and its duration.

Once on a boring day, I enabled all query logging just to see how verbose our logs became. On that fateful day, I set log_min_duration_statement to 0 for approximately ten seconds, and the result was 140MB worth of log files. Thus was my curiosity sated, and my soul filled with abject horror. Faced with such untenable output, how can we do log analysis? There’s no way pgBadger can process 100GB of logs in a timely manner. I tried using it a while ago, and even that ten seconds of log output required over a minute of processing.

It turns out PostgreSQL has had an answer to this for a while, but it wasn’t until the release of 9.2 that the feature became mature enough to use regularly. The pg_stat_statements extension maintains a system catalog table that tracks query performance data in realtime. Constants and variables are replaced to generalize the results, and it exposes information such as the number of executions, the total average run time of all executions, the number of rows matched, and so on. This is more than any log processing utility can do given the most verbose settings available.

I could spend hours churning through log files, or I can execute a query like this:

SELECT calls, total_time/calls AS avg_time, query
  FROM pg_stat_statements
 ORDER BY 2 DESC
 LIMIT 10;

That query just returned the ten slowest queries in the database. I could easily modify this query to find the most frequently executed queries, and thus improve our caching layer to include that data. This module can be directly responsible for platform improvements if used properly, and the amount of overhead is minimal.

In addition, the log settings are still available in conjunction with pg_stat_statements. I normally recommend setting log_min_duration_statement to a value that’s high enough to remove log noise, but low enough that it exposes problems early. I have ours set to 1000 so any query that runs longer than one second is exposed. Even on a system as active as ours, this produces about 5MB of log entries per day. This is a much more reasonable amount of data for log analysis, spot-checking, or finding abnormal system behavior.

All of this said, we could just as easily watch the database cluster and set log_min_duration_statement to a nonzero amount of milliseconds. For most systems, even 20 milliseconds would be enough to prevent log output from saturating our disk write queue. However, the pg_stat_statements extension automatically takes care of performance statistics without any post-processing or corresponding increase in log verbosity, so why add pgBadger to the stack at all?

There may be a compelling argument I’m missing, but for now I suggest using pg_stat_statements without PostgreSQL-focused log post-processing. Ops tools like Graylog or logstash are specifically designed to parse logs for monitoring significant events, and keeping the signal to noise ratio high is better for these tools.

Save logs for errors, warnings, and notices; PostgreSQL is great at keeping track of its own performance.

09 Oct 23:40

Web.br 2014 – Internacionalização na Booking

by diego@tableless.com.br (Tableless.com.br)

eduaro-shiota

A palestra do Shiota nos trouxe uma realidade difícil de encontrar em qualquer site aqui no Brasil. O trabalho de internacionalização da Booking é no mínimo fantástico para qualquer um que nunca trabalhou em um ambiente com tantos idiomas e variáveis.

Abaixo seguem as anotações da palestra:

  • Por volta de 75.4% da população mundial, não falam inglês
  • Algumas vezes você precisa mostrar os preços na moeda local.
  • As vezes você precisa entender a cultura local para vender melhor naquele país.
  • Quando você faz um site para o mundo todo, qualquer evento mundial, pode afetar suas vendas.
  • Quando fazemos um ecommerce no brasil, o preço está em real, português e etc.
  • A joelhada no Neymar afetou as visitações da Booking. O.o
  • O site da Booking está presente em 207 países, tem 135 escritórios pelo mundo, fala 42 idiomas, com 54 moedas.
  • Existem alguns atributos do HTML que te ajudam a criar um site que dá suporte a vários idiomas.
  • Por exemplo o atributo dir.
  • No CSS tem a propriedade direciton:
  • <div lang=”pt-br” xml:lang=”pt-br”></div>
  • html {direction: rtl;}
  • O atributo lang também é muito usado.
  • Você também consegue colocar uma classe no body para facilitar o suporte para browsers antigos.
  • Você já acessou o site em árabe? Você já viu as posições de colunas, imagens, textos e etc? Tenha a curiosidade: http://www.booking.com/index.ar.html?sid=b5a9190f11814df8a0a64fcc61b35862;dcid=4
  • Entenda as diferentes soluções de CSS para implementar websites multi-idiomas. Existem vários impactos nas posições dos elementos. #webb2014
  • Prefira usar inline-block em vez de float.
  • Use também display table/table-cell… é coisa linda. É difícil falar isso, mas ele ajuda muito.
  • Flexbox é o nosso próximo sonho. Já já ele aparece. Assim que os IEs antigos morrerem.
  • Uma palavra pequena no seu idioma, pode ser uma palavra enorme em outro idioma.
  • Nunca use texto direto no HTML. Textos sempre passam pela equipe de copywriting.
  • Há um fluxo pré definido que envolve uma equipe de tradutores e coywriters para criar textos para websites multi-idioma.
  • UTF-8 All Things

---
Este artigo foi escrito por Diego Eis.

Visite o nosso site para mais posts sobre desenvolvimento web! Tableless.

09 Oct 18:32

Artista usa tecnologia para criar interação em tempo real entre pessoas de Japão e Coreia

by Andre Pupo
Inspirado pela histórica animosidade entre Japão e Coreia, o artista Kyle Mcdonald usou a tecnologia para aproximar os dois povos. O projeto Sharing Faces é uma instalação artística que, durante 8 meses, compartilhou fotos entre as cidades de Anyang (Coreia) e Yamaguchi (Japão). Porém, o mais legal na obra é o seu conceito: aqui a […]
09 Oct 18:24

Vulnerabilidade na shell Bash põe em risco máquinas Linux

by Pedro Pinto
…e também máquinas com OSX De acordo com várias noticias publicadas nas últimas horas, o interpretador de comandos Bash tem um problema de segurança grave. Stephane Chazelas, o autor de tal descoberta, refere que a vulnerabilidade está presente até a versão 4.3 do Bash e coloca em risco máquinas Linux e Macs. A vulnerabilidade pode […]
09 Oct 15:46

Josh Berkus: Settings for a fast pg_restore

One thing which we do a lot for clients is moving databases from one server to another via pg_dump and pg_restore.  Since this process often occurs during a downtime, it's critical to do the pg_dump and pg_restore as quickly as possible.  Here's a few tips:
  • Use the -j multiprocess option for pg_restore (and, on 9.3, for pg_dump as well).  Ideal concurrency is generally two less than the number of cores you have, up to a limit of 8.  Users with many ( > 1000) tables will benefit from even higher levels of concurrency.
  • Doing a compressed pg_dump, copying it (with speed options), and restoring on the remote server is usually faster than piping output unless you have a very fast network.
  • If you're using binary replication, it's faster to disable it while restoring a large database, and then reclone the replicas from the new database.  Assuming there aren't other databases on the system in replication, of course.
  • You should set some postgresql.conf options for fast restore.
"What postgresql.conf options should I set for fast restore?" you ask?  Well, let me add a few caveats first:
  • The below assumes that the restored database will be the only database running on the target system; they are not safe settings for production databases.
  • It assumes that if the pg_restore fails you're going to delete the target database and start over.
  • These settings will break replication as well as PITR backup.
  • These settings will require a restart of PostgreSQL to get to production settings afterwards.
shared_buffers = 1/2 of what you'd usually set
maintenance_work_mem = 1GB-2GB
fsync = off
synchronous_commit = off
wal_level = minimal
full_page_writes = off
wal_buffers = 64MB
checkpoint_segments = 256 or higher
max_wal_senders = 0
wal_keep_segments = 0
archive_mode = off
autovacuum = off
all activity logging settings disabled

Some more notes:
  • you want to set maintenance_work_mem as high as possible, up to 2GB, for building new indexes.  However, since we're doing concurrent restore, you don't want to get carried away; your limit should be (RAM/(2*concurrency)), in order to maintain somewhat of an FS buffer.  This is a reason why you might turn concurrency down, if you have only a few large tables in the database.
  • checkpoint_segments should be set high, but requires available disk space, at the rate of 1GB per 32 segments.  This is in addition to the space you need for the database.
Have fun!



08 Oct 14:13

Locked Up Mail, o serviço de email “mais seguro do mundo”

by Denise Helena

Locked Up Mail

Desde que ficamos sabendo da vulnerabilidade em relação à nossa segurança na internet, com as notícias sobre as espionagens por parte de agências governamentais, foram aparecendo novas soluções para garantir a privacidade e segurança dos conteúdos dos usuários em geral, como a que mostraremos agora, uma nova plataforma de email, a qual se apresenta como sendo o email mais seguro do mundo.

Esta plataforma se chama Locked Up Mail, e no momento está em fase privada, por isso ainda não podemos saber muito sobre a mesma, só que conta com proteção contra fraude e muito mais, tudo incluído. Chama poderosamente a atenção o sistema de registro e identificação que dispõe, já que em primeiro lugar é preciso se registrar com o nome de usuário e senha escolhido, gerando automaticamente um código QR, o qual estará visível durante apenas 10 minutos para sua impressão, sendo este o segundo passo. No terceiro passo, é preciso usar este código QR, o qual é preciso escanear para acessar o serviço que, se perdido, será impossível o acesso à própria conta de usuário. Por isso, é aconselhável que as pessoas imprimam o código e o guardem em um local seguro, apesar do armazenamento de uma screenshot também ser uma opção possível.

O mais interessante dessa nova plataforma, sem dúvida, é o fato dela ter sido criada por um menino de apenas 16 anos, o norte-americano Abe Storey, que disse que Locked Up Mail, que tem lançamento marcado para as próximas semanas, é apenas um ponto inicial para ele que, depois dos emails, já tem os bancos como segmento de escolha para as próximas empreitadas.


Artigo escrito no br.wwwhatsnew.com
Acompanhe também as notícias pelo twitter: twitter.com/pooldigital ou pelo RSS


08 Oct 14:07

Edivaldo Brito: Como acessar sites que estão bloqueados em seu país usando o SelekTOR

by edivaldo

Descubra nesse tutorial, como acessar sites que estão bloqueados em seu país, usando o aplicativo SelekTOR, que trabalha com a rede de anonimato Tor.
selektor
Feito em Java, SelekTOR é um front-end gráfico de código aberto para o cliente Tor, que tem algumas vantagens sobre o Vidalia (GUI oficial Tor), tais como:

  • Facilita o uso e configuração do Tor no modo cliente, SelekTOR faz a maioria do trabalho pesado para você;
  • Você pode selecionar rapidamente Nodes de saida por país;
  • SelekTOR pode monitorar continuamente e manter uma conexão com o nó de saída com o melhor tempo de resposta, com tão pouco tempo de inatividade possível;
  • Colocar em proxy todo o tráfego através do nó Tor ativo. SelekTOR também pode fazer o roteamento seletivo de tráfego através do nó Tor ativo com base em padrões de URL.

A opção para selecionar os nós de saída do Tor por país pode ser usada, por exemplo, para acessar sites que não estão disponíveis em seu país, como Netflix, Hulu, CBS, ABC, Pandora, British TV, HBO Go e assim por diante.

SelekTOR precisa de pouquíssima configuração: simplesmente selecione o node de saída do país (e, opcionalmente, o modo de proxy) e você estará pronto – você não tem que configurar o seu navegador web manualmente e não há necessidade de instalar qualquer complemento no navegador. Entre os navegadores suportados estão o Google Chrome, Chromium, Opera, Firefox e Palemoon.

O aplicativo também apresenta detalhes dos nodes, bem como possui um Whois de IP embutido:
selektor-whois
selektor-tor-gui

Instalando os pré requisitos necessário para execução do SelekTOR

Instalar os pré requisitos necessário para execução do SelekTOR, você deve fazer o seguinte:
Passo 1. Se não estiver instalado, instale o Java 7 ou 8 (Oracle o OpenJDK), seguindo esse outro tutorial;
Tor está disponível nos repositórios padrão do Ubuntu, mas eles podem estar um pouco desatualizados. Então, para instalar o Tor atualizado no Ubuntu e derivados, faça o seguinte:

Passo 2. Se você estiver usando uma versão mais recente do Ubuntu e o Tor não estiver instalado, instale-o usando simplesmente o comando;

sudo apt-get install tor

Passo 3. Mas se você estiver usando uma versão mais antiga do Ubuntu e o Tor não estiver instalado, adicione esses repositórios usando o comando abaixo:

sudo sh -c "echo  'deb     http://deb.torproject.org/torproject.org $(lsb_release -cs) main ' /etc/apt/sources.list.d/tor.list"

Passo 5. Baixe e adicione a chave do repositório com o comando:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 886DDD89

Passo 6. Atualize o APT com o comando:

sudo apt-get update

Passo 7. Agora instale o programa com o comando abaixo:

sudo apt-get install tor

Passo 8. Se durante a instalação, você for perguntado qual será usuário que deverá ser capaz de controlar o serviço Tor. Selecione o usuário e confirme clicando em “OK”;
tor1
Passo 9. Uma vez que o tor está instalado, você deve desabilitar o serviço dele. Para fazer isso, abra o arquivo de configuração /etc/default/tor, com o comando a seguir:

sudo gedit /etc/default/tor

Passo 10. Com o arquivo aberto, procure pela seguinte linha:

RUN_DEAMON="yes"

Passo 11. Substitua a linha por isto:

RUN_DEAMON="no".

Passo 12. Salve e feche o arquivo;
Passo 13. Agora, pare o serviço do tor, usando o comando;

sudo service tor stop

Instalando o SelekTOR para poder acessar sites que não estão disponíveis em seu país

Para instalar o SelekTOR, faça o seguinte:
Passo 1. Baixo o programa a partir desse link, e salve na sua pasta pessoal;
Passo 2. Abra um terminal;
Passo 3. Extraia o arquivo baixado usando o comando:

tar -xvzf SelekTOR_Linux.tar.gz

Passo 4. Se seu sistema é baseado no Debian (Ubuntu, Linux Mint, KNOPPIX e etc), execute os seguintes comandos para instalar o programa:

sudo ./install.sh

Passo 5. Para instalar o programa em outras distribuições Linux, execute os estes comandos:

su -c ./install.sh

Passo 6. Se seu sistema é baseado no Debian (Ubuntu, Linux Mint, KNOPPIX e etc), e por algum motivo você precisar desinstalar o programa, use este comando:

sudo /opt/selektor/uninstall.sh

Passo 7. Em outras distribuições Linux, se você precisar desinstalar o programa, use este comando:

su -c /opt/selektor/uninstall.sh

Como acessar sites que não estão disponíveis em seu país usando o SelekTOR

Com tudo instalado, para acessar sites que não estão disponíveis em seu país usando o SelekTOR, , você deve fazer o seguinte:
Passo 1. Execute o programa, digitando selektor no terminal ou no Dash;
Passo 2. Clique no drop-down do campo “Active Country”, e selecione o país que você deseja usar (que obviamente, é o país onde o site que você deseja acessar não é bloqueado);
selecionando-pais
Passo 3. A seguir, clique em “Menu” e depois no item “Proxy Pattern Editor”;
menu-proxy
Passo 4. Na janela “SelekTOR Pattern Editor”, clique em “Add New”. Na pequena tela que aparece, digite o padrão para o site que você está tentando acessar (para isso, utilize os padrões já existentes como exemplo) e clique em “Add New”. Ao voltar a tela anterior, clique no botão “Save” para efetivar o cadastramento;
adicionando-pattern
o método acima tem a vantagem de permitir que você use o Tor apenas para os sites que você quer (como Netflix, por exemplo), deixando todos os outros sites/tráfego sem utilizar proxy. Porém, ele tem uma desvantagem também: se algum site, como o Netflix, por exemplo, usa o código colocado em algum outro domínio, para verificar o seu país, este método irá falhar assim, para tais casos, você deve clicar no drop-down do campo “Proxy Mode”, e selecionar a opção “Anonymous (Proxy all traffic)”;
colocando-tudo-proxy
Ao selecionar o modo proxy “Anonymous (Proxy all traffic)”, todo o tráfego será feito pelo proxy. Por isso, não será necessário introduzir quaisquer padrões, basta selecionar o país que você deseja usar em “Active Country” e você já poderá o site bloqueado.

Via WebUpd8

Não está aparecendo algo?

Este post é melhor visualizado acessando direto da fonte. Para isso, clique nesse link.


O que está sendo falado no blog hoje


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.

08 Oct 13:39

PGDAY Campinas: Docker e PostgreSQL

by Fernando Ike

Fazia um bom tempo que não participava de um evento de PostgreSQL e finalmente a pude participar novamente. Fui no PGDAY Campinas e fiquei muito contente em ver muita coisas nova do PostgreSQL e o ecossistema em volta.

Aliás, teve ligthing talk e puder falar um pouco sobre como usar o PostgreSQL num container Docker.

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.fernandoike.com//www.slideshare.net/slideshow/embed_code/38899288" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" width="425"> </iframe>

Ah, já estava esquecendo. A organização do evento estava excelente, coffee-break também. Parabéns para o pessoal que organizou o PGDAY Campinas! :)

08 Oct 13:25

Microsoft demite mais 2.100 funcionários em todo o mundo

by Ronaldo Gogoni

microsoft

E o bicho continua pegando feio na Microsoft. O CEO Satya Nadella está promovendo uma verdadeira revolução na companhia, e já havia avisado anteriormente que remédios amargos seriam adotados para adequar a empresa à nova realidade do mundo em que está inserida hoje. Portanto era evidente que mais cabeças rolariam: nesta quinta-feira, além dos mais de 12 mil funcionários da Nokia dispensados, mais 2.100 colaboradores foram desligados de Redmond.

Este é na verdade o segundo round das demissões previstas pela Microsoft, de um total de 18 mil postos de trabalho que serão cortados em todo o mundo. De forma dura e sem clemência, a empresa demitiu quase a totalidade dos antigos funcionários da Nokia, que foram absorvidos quando da fusão da empresa. Como a negociação foi concluída e na prática a divisão mobile da empresa finlandesa não mais existe, era evidente que sua mão-de-obra não seria mantida e Redmond repassaria a responsabilidade pela hoje Microsoft Mobile para seu pessoal já presente na companhia. Triste, mas é assim que o mercado de trabalho funciona.

A Microsoft está cortando funcionários dispensáveis em praticamente todos os setores da companhia. A meta é reduzir cerca de 20% do efetivo de Redmond, e a divisão de Sistemas Operacionais capitaneada por Terry Myerson vem sendo uma das mais afetadas, o que dá a entender que Nadella tem uma visão completamente diferente dos caminhos que a plataforma Windows (seja desktop, tablet ou mobile) deve percorrer de agora em diante, e em teoria não mais precisaria de um grande pessoal envolvido.

No total o primeiro round dispensou 13 mil funcionários. Com mais 2.100 indo embora agora, restam mais 2.900 cabeças que serão cortadas até julho de 2015, isso se Nadella não julgar o número de demissões insuficiente para manter a Microsoft no que ele julga o rumo certo. Evidentemente que isso terá um reflexo nos lucros da companhia, mesmo que os gastos com as demissões fiquem em torno de US$ 1,1 e US$ 1,6 bilhão, o que mostra que o conselho está exercendo grande influência em Nadella para que ele gere lucro rápido, algo que é fortemente apoiado pelo VP de Dispositivos e Serviços Stephen Elop.

Fonte: ZDN.

The post Microsoft demite mais 2.100 funcionários em todo o mundo appeared first on Meio Bit.








07 Oct 22:09

O artista com paralisia cerebral que usava máquinas de escrever para criar pinturas detalhadas

by Redação Hypeness
Muitos dizem que fazer arte é uma necessidade do homem. Mas o que fazer quando o corpo não permite segurar uma caneta ou pincel? O artista Paul Smith, que nasceu com uma grave paralisia cerebral, aprendeu na máquina de escrever a dar vazão a arte que se criava dentro de si, mas não na forma […]
07 Oct 22:02

Usando o ack ao invés do grep

Tenho colaborado com outros desenvolvedores em um código fonte de um sistema distribuído feito em Java. O código desse sistema é muito grande, possui muitas classes e quem conhece Java sabe que essas classes ficam espalhadas em muitos arquivos. As vezes preciso observar como foi utilizado um método de um objeto, mas nem sempre me lembro em que classe esse objeto foi usado. Até pouco tempo, eu usava o ``grep``. Porém, a quantidade de parâmetros que eu tinha que passar para o ``grep`` estavam começando a aumentar muito em função das especificidades da minha busca e da quantidade de arquivos que o sistema tinha.
07 Oct 21:56

Josh Berkus: Finding Duplicate Indexes

Recently a client asked us to help them find and weed out duplicate indexes.  We had some old queries to do this, but they tended to produce a lot of false positives, and in a database with over 2000 indexes that wasn't going to cut it.  So I rewrote those queries to make them a bit more intelligent and discriminating, and to supply more information to the user on which to base decisions about whether to drop an index.

Here's the first query, which selects only indexes which have exactly the same columns.  Let me explain the columns of output it produces:
  • schema_name, table_name, index_name: the obvious
  • index_cols: a comman-delimited list of index columns
  • indexdef: a CREATE statement for how the index was created, per pg_indexes view
  • index_scans: the number of scans on this index per pg_stat_user_indexes
Now, go run in on your own databases.  I'll wait.

So, you probably noticed that we still get some false positives, yes?  That's because an index can have all the same columns but still be different.  For example, it could use varchar_pattern_ops, GiST, or be a partial index.  However, we want to see those because often they are functionally duplicates of other indexes even though they are not exactly the same.  For example, you probably don't need both an index on ( status WHERE cancelled is null ) and on ( status ).

What about indexes which contain all of the columns of another index, plus some more?  Like if you have one index on (id, name) you probably don't need another index on just (id).  Well, here's a query to find partial matches.

This second query looks for indexes where one index contains all of the same columns as a second index, plus some more, and they both share the same first column.  While a lot of these indexes might not actually be duplicates, a lot of them will be.

Obviously, you could come up with other variations on this, for example searching for all multicolumn indexes with the same columns in a different order, or indexes with the same first two columns but others different.  To create your own variations, the key is to edit the filter criteria contained in this clause:

WHERE EXISTS ( SELECT 1
    FROM pg_index as ind2
    WHERE ind.indrelid = ind2.indrelid
    AND ( ind.indkey @> ind2.indkey
     OR ind.indkey <@ ind2.indkey )
    AND ind.indkey[0] <> ind2.indkey[0]
    AND ind.indkey <> ind2.indkey
    AND ind.indexrelid <> ind2.indexrelid
)

... and change it to figure out the factors which give you the most real duplicates without missing anything.

Happy duplicate-hunting!
07 Oct 20:58

Denish Patel: Postgres in Amazon RDS

Today, I presented on “Postgres in Amazon RDS” topic at Postgres Open Conference in Chicago. Here is the slide deck:

06 Oct 19:38

Sistema de reconhecimento facial do FBI já está operacional

by Ronaldo Gogoni

fbi-face-recognition-001

Se você já andava paranoico desde o menino da informática do Kremlin Edward Snowden botou a boca no trombone, não vai gostar nada dessa notícia. Após seis anos de desenvolvimento e US$ 1 bilhão de investimento, o FBI anunciou o lançamento de seu poderoso sistema de reconhecimento facial, capaz de capturar e identificar milhões de faces de indivíduos e mais interessante, tendo inúmeras fontes como base de seu banco de dados.

O sistema do FBI chamado Next-Generation Identification (NGI) possui dois serviços distintos: o primeiro é chamado de Rap Back, que vai disponibilizar às autoridades informações acuradas sobre qualquer pessoa em cargos de confiança, desde professores e médicos a executivos. Agentes penitenciários também poderão utilizar a ferramenta para monitorar pessoas em situações de condicional ou que estejam em débito com a justiça.

É aí que entra a outra metade do NGI, o Interstate Photo System (IPS), um enorme banco de dados de impressões digitais e imagens dos rostos de pessoas, além do poderoso sistema de reconhecimento facial que permitirá identificar qualquer pessoa em qualquer lugar. Mas mais do que rostos, o IPS armazenará imagens de tatuagens, cicatrizes e outras características que facilitem o reconhecimento pelo sistema.

fbi-face-recognition-003

O grande problema dessa abordagem do FBI é que diferente do que se pode imaginar, o banco de dados armazenará não apenas mugshots de criminosos, mas imagens e impressões digitais do banco de registros civis. Ou seja, basta a pessoa tirar um documento novo ou se candidatar para um emprego que sua foto e digitais vão para o banco de dados do FBI. A desculpa é a de sempre: “identificar terroristas em público antes que possam fazer qualquer coisa”. O órgão diz que a coleta de imagens de civis é legal; claro, o governo norte-americano não daria ponto sem nó.

fbi-face-recognition-002

A questão é que para permitir que todas as câmeras capazes de captar imagens nas ruas sejam passíveis de identificar criminosos, era de se esperar que o banco de dados contaria com imagens de em teoria todos os cidadãos dos Estados Unidos (ou mais, visto que turistas também precisam se registrar. Pois é, sua foto e digitais podem fazer parte do banco de dados do FBI, durma com essa), permitindo que policiais e agentes tenham acesso a informações apuradas de qualquer meliante em segundos. Como o FBI não deu maiores detalhes, fica a dúvida se os dados dos cidadãos em geral não serão comprometidos e mais, a margem de erro do sistema não pode ser precisada, portanto não dá para saber o que poderia acontecer no caso do NGI confundir um terrorista com um florista.

Fontes: FBI, aqui e aqui.

The post Sistema de reconhecimento facial do FBI já está operacional appeared first on Meio Bit.








05 Oct 00:33

Ingressos para o tênis de mesa, nos Jogos Olímpicos de 2016, são divulgados

by Imprensa CBTM

Valores variam de R$ 50 a R$ 350. Período de cadastramento para vendas começa em novembro deste ano

Da redação, no Rio de Janeiro (RJ) - 16/9/2014

O Comitê Organizador Rio 2016 divulgou, nesta terça-feira (16/9), a tabela de preços de cada modalidade contemplada pelos Jogos Olímpicos.  Os valores das entradas para acompanhar tênis de mesa irão de R$ 50 a R$ 350. O período de vendas terá três fases e começará em novembro deste ano.

Os preços dos ingressos para assistir aos melhores mesatenistas do mundo variam de acordo com a categoria dos assentos e a fase da competição. Na etapa preliminar, que inaugura o torneio, os interessados poderão pagar R$ 50, pela categoria B, ou R$70, pela A. Nas duas fases seguintes, a lógica é a mesma: quartas de final por R$60 ou R$100 e finais por R$180 ou R$350.

Em novembro, terá início o cadastramento no site de vendas. Entre março e maio de 2015, os pedidos serão feitos e, em junho e julho, sorteados. Em setembro, aqueles que não obtiveram êxito na compra das entradas terão mais uma chance: os ingressos que sobraram serão colocados à venda. A entrega será feita a partir de maio de 2016.

Os torneios de tênis de mesa dos Jogos Olímpicos de 2016 acontecerão no Pavilhão 3 do Riocentro, na Barra da Tijuca, Zona Oeste do Rio de Janeiro.
 

A Confederação Brasileira de Tênis de Mesa conta com recursos da Lei Agnelo/Piva – Lei de Incentivo Fiscal e Governo Federal – Ministério do Esporte.

Siga a CBTM nas redes sociais:

 

FACEBOOK: www.facebook.com/TMBrasil

TWITTER: www.twitter.com/cbtm_tm

INSTAGRAM: @cbtenisdemesa

 

iDigo | Assessoria de comunicação CBTM

imprensa@cbtm.org.br

 

Tweet This
01 Oct 19:57

GNU e Linux: sem um não existiria o outro. Tem certeza?

by Helio Loureiro

É comum encontrar em fóruns algumas discussões acaloradas sobre o uso do termo “GNU/Linux” ao invés de “Linux”, e que o mesmo não seria o que é, pois é somente um kernel, sem o GNU.

Concordo em número, gênero e grau sobre a importância do GNU na história do software livre, e mesmo na do Linux.  Sem a influência de liberdade, Linus nunca teria pensado em ter um sistema completamente aberto.  Mas será mesmo que ele precisava das ferramentas da GNU, ou de outro modo não conseguiria sair do zero?

linuxbsd

BSD para quem ama Unix

Em uma entrevista de 1993 anos, Linus Torvalds comenta que não teria nem tentando criar o Linux se o 386BSD existisse.

The choice of GNU generation

Pra quem não lembra, Linux foi criado em 1991, enquanto que o FreeBSD apareceu somente em 1993. Onde estava o BSD esse tempo todo?

Em 1991, Berkeley estava sofrendo um processo judicial por parte da AT&T, a dona do código fonte do UNIX, que tinha compartilhado com Berkeley durante sua origem, nos anos 70. O UNIX BSD sempre fora distribuído gratuitamente, e com códigos fontes abertos e livres, sob a licença BSD. Enquanto a AT&T tinha o UNIX como um projeto de laboratório, uma brincadeira dos engenheiros, isso não importava muito. Mas no final da década de 1980, o UNIX já era muito difundido e usado tanto nas universidades quanto fora delas. Quando a AT&T chegou ao fim de seu contrato de monopólio das telecomunicações, ela simplesmente resolveu comercializar seu UNIX. E como lidar com o seu concorrente livre, o BSD? Não teria problema se continuasse dentro das universidades, mas existia uma empresa que vendia um UNIX derivado do BSD, o BSDi. Então, entra um processo judicial no meio do caminho.

O BSD estava na sua 4ª versão, que incluía o stack recém criado de redes, o TCP/IP. O processo terminou em 1992, quando foi feito um acordo em que o código BSD seria reescrito sem a parte que pertencia à AT&T. Surgia a especificação 4.4BSD-lite. Nessa época, a revista Dr.Dobbs iniciou uma série de artigos que vinham com o código pra ter o BSD rodando em computadores com o processador i368.  Era o surgimento do 386BSD.

Mas o 386BSD tinha o problema de ter dono, Lynne Jolitz e William Jolitz. Apesar do código estar totalmente publicado e permitir qualquer um compilar seu próprio UNIX BSD, era preciso passar quase dois dias aplicando patches de voluntários pra ter o sistema atualizado e funcional. Nesse ambiente sugiram os sistemas FreeBSD e NetBSD, como uma forma mais colaborativa de participação e manutenação do código.

E o GNU? Nesse meio tempo,entre 1990 e 1993, pode-se dizer que os UNIX BSDs praticamente pararam seu desenvolvimento. Eles existiam dentro de máquinas PDP (os mini computadores da época), mas não nos computadores pessoais, que era o que Linus usava em casa pra programar. Os BSDs precisavam do GNU? Precisavam, mas não do GNU como um todo. Eles usavam o compilador GCC, que foi um dos marcos mais importantes do software livre. O restante dos comandos básicos para kernel já tinham em BSD. O Linux é um kernel, enquanto que o FreeBSD é um sistema operacional completo, que descendente direto do UNIX.

Se Linus tivesse começado um pouco depois, em 92, ele poderia ter construído o Linux em cima de uma base BSD. E continuaria um software livre. As vantagens? Acho que talvez o licenciamento mudasse pra BSD – mas provavelmente seria muito semelhante com o que temos hoje.

Mudar pra BSD ainda é possível?

Possível, é; mas valeria o esforço? Eu diria que não. O Linux funciona muito bem com a parte GNU e se um dia surgisse algum problema de licenciamento (o que é impossível com softwares da GNU), ele poderia eventualmente ter um esforço pra mudar.

Benefícios de desempenho? Acho que também não. Apesar dos BSDs terem um stack de rede com desempenho superior ao do Linux, isso não é imutável e frequentemente acontece de um passar o desempenho do outro. Recentemente, o Facebook anunciou uma iniciativa de melhorar o stack de rede do Linux pra igualar ao do FreeBSD. Eu espero que supere, pra assim o grupo do BSD ter um objetivo pra melhorar mais.

E os BSDs não estão na frente em tudo. O próprio “grep” da GNU é muito mais rápido e eficiente que seu semelhante BSD – pra listar apenas alguns.

Então, antes de dizer que Linux não seria nada sem o GNU, lembre dos BSD. Atualmente nem o compilador é mais o GCC, sendo um sistema operacional totalmente funcional sem precisar necessariamente do GNU. E 100% software livre.

Ah, vale lembrar que o Android é um kernel Linux sem GNU, totalmente feito em cima de BSD. E sim, o desempenho é muito bom.

01 Oct 16:05

Server-side routes vs. Client-side routes

by Guilherme Oderdenge

Lá no SOPT, o usuário Rod fez a seguinte pergunta:

“Qual a vantagem e desvantagem das rotas serem feitas por server(php,asp.net, etc) ou serem por client(angularjs,emberjs,backbone…)? Em relação performance, qual tem maior? Segurança, mobile, usabilidade?”

Achei um assunto bem relevante e resolvi responder.

As rotas são desencadeadores de comportamentos. Quando você acessa http://seusite.com/contato/, a ideia é que seja exibida uma página destinada a contatos. O roteador, neste caso, é o responsável por “explicar” para a aplicação que algum usuário está tentando acessar /contato/ e então algo deve ser feito – neste caso fantasia, o objetivo é exibir a página contato.html, por exemplo.

No caso do JavaScript, independente da plataforma, a ideia é que sejam invocados comportamentos específicos para cada página que o usuário acessar. No nosso exemplo (/contato/), considere que exista um formulário para que o usuário entre com o seus dados. Este formulário, por sua vez, possui uma validação que, no caso do Backbone.js, pode ser resolvido com Backbone.Validation.

Dada a situação, pensamos: seria válido invocarmos o Backbone.Validation para qualquer página, visto que apenas /contato/ possui um formulário?Negativo. Isso é conceitualmente ruim. O roteamento faz justamente isso: desencadeia uma entidade específica para que ela seja responsável por maestrar o que vai ou não acontecer na página solicitada.

Para reforçar, existem dois princípios que se aplicam para este caso: KISS e DRY.

O que são essas “entidades”?

As entidades são os “controllers”, no caso de Angular.js ou Marionette.js; Para Backbone.js, temos as “views” que fazem o serviço.

E a concorrência de cliente com servidor?

Na verdade, a concorrência é relativa. Você pode possuir rotas de cliente e servidor se assim quiser: no cliente você lida com o que a devida rota vai trabalhar em termos de JavaScript; no servidor você lida com o que vai acontecer com o cliente quando tal rota for executada.

Mas, o que isso significa? Se você tiver uma SPA (aplicação de página única), as rotas em cliente são suficiente; se você possuir várias páginas, você (provavelmente) irá trabalhar com roteamento em ambos os lados, tanto cliente quanto servidor, porque indicar o que de JavaScript deve ser executado não será suficiente.

Em relação a performance, qual tem maior? E quanto a segurança, mobile, usabilidade?

O ideal é não comparar a performance das rotas do cliente contra as do servidor – as propostas são diferentes e você tem que optar por aquela que satisfaz (melhor) a sua necessidade.

Você pode controlar todo o roteamento pelo servidor e não utilizar o oferecido pelo cliente: isso, por hora, vai te dar um bootstrap mais produtivo, principalmente se o seu nível de conhecimento sobre as frameworks front-end não for alto; entretanto, por outro lado, vai te gerar um maior número de requisições e a facilidade de escalabilidade do seu aplicativo pode estar comprometida no futuro pela perda de controle e capacidade de manutenção que esse roteamento singular trará.

Como exemplo da empregabilidade paralela dos dois roteamentos, vejamos o GitHub:

  1. Acesse o repositório oficial do Backbone;
  2. Abre o console do seu navegador com, provavelmente, Ctrl + Shift + I ou F12;
  3. Volte o seu foco para o repositório do Backbone;
  4. Clique na pasta “docs“.

Percebeu que foi feita uma requisição do tipo GET e outra do tipo POST e nada foi recarregado? Pois é, o Backbone, por exemplo, traz um conjunto que torna esse mecanismo possível. Começando pelo Backbone.Router, indo até o window.history.

Agora, vou lhe pedir outra coisa: acesse a pasta /docs/ diretamente, emitindo uma requisição síncrona do tipo GET.

Esperando você fazer…

Então, você foi direcionado exatamente para o mesmo lugar que antes, quando você primeiro acessou o repositório e através de um click acabou na pasta /docs/. O que aconteceu é que o roteamento do servidor acabou de cumprir o seu papel — papel esse que um roteador de cliente não assumiria.

Para trabalhar com pushState, eu obrigatoriamente preciso de um roteador no cliente? Roteador é nomenclatura, não algo sólido. A lógica dos roteadores em geral é que você tem que observar uma alteração na URL; se houver uma alteração, então faça algo. Salientando que “se houver uma alteração”, faz parte de roteadores de cliente – roteamento do servidor não tem capacidade de perceber “alterações” em tempo real (como eu disse, coisas diferentes!).

Para ilustrar melhor um roteador, veja o seguinte:

pOAnD

Esse “diagrama” representa o modelo mais comum de roteamento. A princípio, tudo são apenas nomes – o que significa que você pode ter uma estrutura exatamente igual a essa e nunca antes se deu conta. Além disso, obviamente, podem existir outros dispositivos entre os laços dessa trilha – como models, helpers, etc –, mas a diáspora de requisições se move nesse fluxo; nesse sentido.

E quanto a segurança?

Falando de segurança, a premissa é trivial: proteja realmente a sua aplicação no servidor. O cliente é para lidar com informações que as pessoas precisam ver e interagir com elas. Ele jamais deve executar processos lógicos de qualquer porte. De antemão, o cliente deve servir para você mostrar mensagens de erros – o critério por trás dessas mensagens é que deve ser de responsabilidade do servidor: isso é roboticamente imburlável.

Como segurança nunca é demais, você pode juntar o útil ao agradável: faça validações duplex. Tente assegurar o máximo possível no navegador – se caso algo passar em branco ou for burlado, tenha certeza de que o servidor estará à prova de balas. Efeito da ação e reação: validações no cliente exigem mais recursos por parte do usuário. Jamais se esqueça disso.

Ok, e onde entram as rotas + segurança? Ei, calma! A responsabilidade delas é encaminhar pessoas para lugares. A higienização das pessoas que vão passar pelas portas é da responsabilidade de outrem.

… Mobile?

As regras para aplicativos (web) mobile são as mesmas, mas sempre lembrando que as requisições devem ser na menor quantidade possível para garantir uma velocidade de navegação mais satisfatória.

Se você se refere à aplicativos nativos: isso é assunto para um outro artigo!

Para acessar a resposta, eis o link.

Mensagem do anunciante:

Torne-se um Parceiro de Software Intel®. Filie-se ao Intel® Developer Zone. Intel®Developer Zone

01 Oct 01:51

Diário oficial: como dizer “diário oficial” em inglês?

by Ulisses Wehby de Carvalho

Marina Bevilacqua de La Touloubre

Diário oficial

Diário oficial
[Federal register; Brazilian federal register*]

diário oficial

* No sistema norte-americano Federal Register é a publicação equivalente ao nosso Diário Oficial da União.

“Federal Register. A daily publication containing presidential proclamations and executive orders, federal agency regulations of general applicability and legal effect, proposed agency rules, and documents required by law to be published. The “Federal Register” is published by the National Archives and Records Administration.” (Black’s)

Cf. Como se diz “Ministério Público” em inglês? Existe?

Cf. Estágio: como se diz “estágio profissionalizante” em inglês?

Cf. LAWYER x ATTORNEY: como se diz “advogado” em inglês?

Você gostou da dica? Já sabia dizer “diário oficial” em inglês ou a informação foi útil para você? Nós do Tecla SAP gostaríamos de saber o que você achou do texto. Por favor, envie sua opinião na seção de comentários, no rodapé da página.

Se tiver alguma dúvida sobre este ou qualquer outro assunto da língua inglesa, envie sua pergunta para o Fórum Tecla SAP. Participe!

Referência: “Dicionário Jurídico Bilíngue – Português > Inglês, Inglês > Português” – Marina Bevilacqua de La Touloubre, Editora Saraiva, 2010. Leia a sinopse e adquira seu exemplar com conforto e segurança no site da Disal Distribuidora.

The post Diário oficial: como dizer “diário oficial” em inglês? appeared first on Tecla SAP.

29 Sep 13:48

Michael Paquier: Postgres 9.5 feature highlight: Logging of replication commands

Postgres 9.5 will come up with an additional logging option making possible to log replication commands that are being received by a node. It has been introduced by this commit.

commit: 4ad2a548050fdde07fed93e6c60a4d0a7eba0622
author: Fujii Masao <fujii@postgresql.org>
date: Sat, 13 Sep 2014 02:55:45 +0900
Add GUC to enable logging of replication commands.

Previously replication commands like IDENTIFY_COMMAND were not logged
even when log_statements is set to all. Some users who want to audit
all types of statements were not satisfied with this situation. To
address the problem, this commit adds new GUC log_replication_commands.
If it's enabled, all replication commands are logged in the server log.

There are many ways to allow us to enable that logging. For example,
we can extend log_statement so that replication commands are logged
when it's set to all. But per discussion in the community, we reached
the consensus to add separate GUC for that.

Reviewed by Ian Barwick, Robert Haas and Heikki Linnakangas.

The new parameter is called log_replication_commands and needs to be set in postgresql.conf. Default is off to not log this new information that may surprise existing users after an upgrade to 9.5 and newer versions. And actually replication commands received by a node were already logged at DEBUG1 level by the server. A last thing to note is that if log_replication_commands is enabled, all the commands will be printed as LOG and not as DEBUG1, which is kept for backward-compatibility purposes.

Now, a server enabling this logging mode...

$ psql -At -c 'show log_replication_commands'
on

... Is able to show replication commands in LOG mode. Here is for example the set of commands set by a standby starting up:

LOG:  received replication command: IDENTIFY_SYSTEM
LOG:  received replication command: START_REPLICATION 0/3000000 TIMELINE 1

This will certainly help utilities and users running audit for replication, so looking forward to see log parsing tools like pgbadger make some nice outputs using this information.

17 Sep 01:11

PHP 5.6.0 lançado! Quais as novidades?

by Rafael Jaques

O post PHP 5.6.0 lançado! Quais as novidades? apareceu primeiro em PHPit.

PHP Logo

No dia 28 de agosto de 2014 foi lançada a versão 5.6.0 do PHP.

Escrevo este rápido artigo apenas para listar algumas das novas funcionalidades dessa versão. Caso você queira mais detalhes sobre as novidades e sobre como migrar, visite a página oficial PHP 5.6 new features.

Expressões com constantes escalares

Agora é possível fornecer uma expressão escalar envolvendo números e strings e/ou constantes em contextos que anteriormente o PHP esperava um valor estático, como em declaração de constantes e propriedades e na definição de argumentos padrão para funções.

<?php
const UM = 1;
const DOIS = UM * 2;

class C {
    const TRES = DOIS + 1;
    const UM_TERCO = UM / self::TRES;
    const SENTENCA = 'O valor de TRES e '.self::TRES;

    public function f($a = UM + self::TRES) {
        return $a;
    }
}

echo (new C)->f()."\n";
echo C::SENTENCA;
?>

O exemplo acima retornará:

4
O valor de TRES e 3

__debuginfo()

Foi uma das novidades que mais gostei. Agora e possível utilizar o método mágico __debuginfo() para modificar as propriedades e valores que são mostrados quando o objeto é chamado por um var_dump().

<?php
class A {
    private $prop;

    public function __construct($valor) {
        $this->prop = $valor;
    }

    public function __debugInfo() {
        return [
            'propQuadrado' => $this->prop ** 2,
        ];
    }
}
var_dump(new A(42));
?>

O exemplo acima retornará:

object(A)#1 (1) {
["propQuadrado"]=>
int(1764)
}

use function e use const

The use operator has been extended to support importing functions and constants in addition to classes. This is achieved via the use function and use const constructs, respectively.

O operador use agora suporta importação de funções e constantes, além de classes. Você pode fazer isso a partir de use function e use const.

<?php

namespace Name\Space {
    const FOO = 42;
    function f() { echo __FUNCTION__."\n"; }
}

namespace {
    use const Name\Space\FOO;
    use function Name\Space\f;

    echo FOO."\n";
    f();
}
?>

O exemplo acima retornará:

42
Name\Space\f

E mais

Além dessas funcionalidades que comentei, ainda está incluso no pacote:

  • Adicionado suporte a MIME type no CLI
  • São aceitos uploads maiores que 2GB
  • Suporte a funções variádicas e desempacotamento de argumentos (já falei sobre isso aqui)
  • PHPDBG embutido por padrão
  • Melhorias na extensão Zip
  • UTF-8 agora é padrão
  • Exponenciação via ** ($variavel = 3**2;)
  • O wrapper php://input agora pode ser aberto quantas vezes for necessário, o que levou a uma redução da memória utilizada pelo POST

 

E você? Já experimentou essa versão? Deixe uma mensagem com seus comentários sobre mais essa atualização do PHP rumo à versão 6!

Não se esqueça que todas as novas funcionalidades estão comentadas no blog oficial do PHP.

Um abraço a todos e fiquem com Deus.
Rafael Jaques

O post PHP 5.6.0 lançado! Quais as novidades? apareceu primeiro em PHPit.

17 Sep 01:05

Relevance

Last week there were a bunch of great posts expounding on the staying power of blogs and RSS. It seems we’re not the only people comparing social media platforms to the open web and we gained a lot of valuable new insight.

All weekend I’ve been thinking about relevance. When Twitter first took off, it delivered. So much of my Twitter feed was filled with timely, interesting material that it became addictive.

But over time Twitter became more of a platform for self-promotion, corporate advertisement, and random, passive-aggressive posts from college roommates. It went from “check out this amazing article I read” to “look at me because I said so.” That’s just not relevant to me.

Facebook never really delivered on relevance, but it was at least new and fresh for a while. Now it feels like an obligation. Happy Birthday. Yes, I like your new hat. Congratulations on your anniversary. Oooh, she’s so cute. And, of course, buy this stuff from Nordstrom.

But blogs and RSS, like email and websites, remain. They are solely focused on delivering relevant information. Could they be better? Heck yes. Check out my queue after I spent several hours reading yesterday:

image

Yikes, that’s a lot of reading left to do. But that’s 2,619 posts with the highest signal to noise ratio I’m going to see all day. We’re hard at work with ideas to make that even better. And we believe that social is going to be the key in improving that ratio.

We’ll have more on that in the future. But for now, let’s all get back to blogging and reading. May your screen be filled with relevance.

14 Sep 13:25

Canonical Releases Ubuntu Developer Tools Center, Makes It Easy To Install Android Studio And Android SDK In Ubuntu

by noreply@blogger.com (Andrew)
Canonical wants to make developers who create applications for platforms other than Ubuntu feel at home. In a recent article posted on his blog, +Didier Roche, Software Engineer at Canonical, writes: "Ubuntu loves developers and we are going to showcase it by making Ubuntu the best available developer platform!".

To achieve this, the Ubuntu Developer Tools Center was created, a project to enable quick and easy setup of common developers needs on Ubuntu. For now, Canonical is focusing on Android developers, but more will follow, like Go developers, web developers, Dart and more.

Android Studio Ubuntu Developer Tools Center
Android Studio installed in Ubuntu 14.04 using UDTC

Ubuntu Developer Tools Center is currently in alpha and right now, it allows installing the latest version of Android Studio along with the latest Android SDK and their dependencies, enable multi-arch on 64bit machines as well as integrate Android Studio with the Unity Launcher.

Ubuntu Developer Tools Center (UDTC) will always target the latest Ubuntu development version along with the latest Ubuntu LTS (long-term support) version. Right now, Ubuntu 14.04 users who want to install UDTC will have to use the official Ubuntu Developer Tools Center PPA (see installation instructions below), but in the future it should be available in the official Ubuntu 14.04 (backports) repositories. As for Ubuntu 14.10 Utopic Unicorn, UDTC is already available in the repositories.


Install Ubuntu Developer Tools Center with Android Studio and Android SDK in Ubuntu


Ubuntu Developer Tools Center is currently in alpha so you'll encounter bugs! Report them @ Launchpad or GitHub.

Before proceeding, if you've used the unofficial Android Studio PPA maintained by Paolo Rotolo, purge the android-studio package:
sudo apt-get purge android-studio
sudo rm -r "/usr/share/android-studio"

1. Install Ubuntu Developer Tools Center

Ubuntu 14.10: as I said, UDTC is already available in the Ubuntu 14.10 Utopic Unicorn repositories so to install it, use the following command (or search for it in Ubuntu Software Center, Synaptic, etc.):
sudo apt-get install ubuntu-developer-tools-center

Ubuntu 14.04: Ubuntu Developer Tools Center is available in an official PPA maintained by Didier Roche. Add the PPA and install UDTC using the following commands:
sudo add-apt-repository ppa:didrocks/ubuntu-developer-tools-center
sudo apt-get update
sudo apt-get install ubuntu-developer-tools-center

2. Install Android Studio and Android SDK using UDTC

Ubuntu Developer Tools Center

To install Android Studio and Android SDK, simply run the following command:
udtc android

Then, select to accept the license ("a") and UDTC will do the rest, installing Android Studio and Android SDK.

UDTC will only ask for your your password if it needs to install some required dependencies which aren't installed on your system.

via / more info @ didrocks
16 Aug 23:11

Drones assassinos malvados… Made in Brazil?

by Carlos Cardoso
floquinha2

Vai floquinha…

A imagem acima correu as interwebs mês passado. Uma floquinha INDIGNADA com a Martha Stewart, por usar um drone para fotografar a própria fazenda.

Como toda indignada profissional de internet a criatura não se deu ao trabalho de pesquisar e descobrir que drones, ou UAVs, ou VANTs são termos que cobrem centenas de aplicações diferentes, e um UAV com uma GoPro atuchada na barriga é bem diferente de um bicho como este:

811664734458743213

Se bem que este é um drone do Hamas, então é do bem. Os foguetes só devem levar doces e brinquedos pras criancinhas de Israel.

A lógica anti-drone não faz sentido. Reclamam que os drones são “covardes” por não terem piloto. Ok, troque o drone por um F16. Os dois sujeitos num camelo terão as MESMAS chances de derrubar o inimigo: zero. E guerra não tem que ser justa, guerra boa é a que os meus rapazes e moças voltam pra casa inteiros.

Mesmo que drones militares fossem terríveis e malvados mesmo, demonizar todos os drones por causa das aplicações militares faz tanto sentido quanto demonizar automóveis por serem usados em guerra. Ou… aviões. O avião que mais salvou vidas no mundo, o Hércules C130 tem uma variação de combate, a AC130 que já matou mais gente que qualquer caça pós-Segunda Guerra.

O bom dos drones é justamente essa versatilidade, e tanto podem ser usados para combate, como os EUA, Rússia, Israel, Hezbollah e Hamas usam, como para aquisição de informação. Antes das meninas sequestradas nigerianas terem sido “devolvidas”, depois que a campanha de hashtag no Twitter resolveu o problema e convenceu o Boko Haram da maldade de seus atos, drones foram utilizados para identificar locais de cativeiro, e efetivamente salvar várias das meninas.

Países com problemas de violência interna, como Sudão, Nigéria e similares precisam de drones, mas os americanos e israelenses são muito caros. Quem poderá ajudar?

Isso mesmo, o Brasil que Funciona.

No caso a Flight Tech, uma empresa de São José dos Campos que desenvolve tecnologia de veículos aéreos não-tripulados em conjunto com o IME. Um desses equipamentos é o Horus, um drone de pequeno porte com autonomia de 2 h, raio operacional de 15 km e 7 kg de peso. 

FT Sistemas S/A — Horus-Gericino

O Horus pode ser usado em situações de busca e salvamento, reconhecimento aéreo inclusive com visão noturna, controle de multidões, kamikaze contra black blocs e muito mais. Agora ele está sendo exportado, uma nação africana não-identificada comprou várias unidades, incluindo apoio logístico. É a primeira vez que um UAV brasileiro foi exportado.

Um drone não precisa estar armado para ser útil, e uma empresa de tecnologia não precisa ser a SpaceX para fazer um bom trabalho. Parabéns à Flight Tech por mostrar que brasileiro sabe fazer bonito sem ser só com bola no pé, se bem que depois do 7 × 1 na seleção… ok, fiquemos só com a Flight Tech mesmo! ;)

The post Drones assassinos malvados… Made in Brazil? appeared first on Meio Bit.








08 Aug 18:36

Tech Tip: Using SNI to allow multiple SSL domains on a single IP

by Lewis

I recently started really thinking about the dwindling number of available IPv4 addresses and what we can do to use them more efficiently. One option that I had not revisited in a while is Server Name Indication (SNI). It is an extension to SSL/TLS, which enables sending of the domain being requested during initial negotiation of the secure connection, allowing web servers to be able to provide the correct security certificate for that domain, even if there are multiple domains on the same IP.

read more

03 Aug 18:50

Shaun M. Thomas: Friends Don’t Let Friends Use Loops

Programming is fun. I love programming! Ever since I changed my career from programming to database work, I’ve still occasionally dabbled in my former craft. As such, I believe I can say this with a fair amount of accuracy: programmers don’t understand databases. This isn’t something small, either; there’s a fundamental misunderstanding at play. Unless the coder happens to work primarily with graphics, bulk set-based transformations are not something they’ll generally work with.

For instance, if tasked with inserting ten thousand records into a database table, a programmer might simply open the data source and insert them one by one. Consider this basic (non-normalized) table with a couple basic indexes:

CREATE TABLE sensor_log (
  sensor_log_id    SERIAL PRIMARY KEY,
  location         VARCHAR NOT NULL,
  reading          BIGINT NOT NULL,
  reading_date     TIMESTAMP NOT NULL
);

CREATE INDEX idx_sensor_log_location ON sensor_log (location);
CREATE INDEX idx_sensor_log_date ON sensor_log (reading_date);

Now suppose we have a file with ten thousand lines of something like this:

38c-1401,293857,2014-07-25 10:18:38-05:00
69a-8921,209574,2014-07-25 10:18:25-05:00
9e5-0942,690134,2014-07-25 10:18:16-05:00

To load this data, our coder chooses Python and whips up an insert script. Let’s even give the programmer the benefit of the doubt, and say they know that prepared queries are faster due to less overhead. I see scripts like this all the time, written in languages from Java to Erlang. This one is no different:

import psycopg2

db_conn = psycopg2.connect(database = 'postgres', user = 'postgres')
cur = db_conn.cursor()

cur.execute(
  """PREPARE log_add AS
     INSERT INTO sensor_log (location, reading, reading_date)
     VALUES ($1, $2, $3);"""
)

file_input = open('/tmp/input.csv', 'r')
for line in file_input:
    cur.execute("EXECUTE log_add(%s, %s, %s)", line.strip().split(','))
file_input.close()

cur.execute("DEALLOCATE log_add");

db_conn.commit()
db_conn.close()

It’s unlikely we have the /tmp/input.csv file itself, but we can generate one. Suppose we have 100 locations each with 100 sensors. We could produce a fake input file with this SQL:

COPY (
    SELECT substring(md5((a.id % 100)::TEXT), 1, 3) || '-' ||
           to_char(a.id % 100, 'FM0999') AS location,
           (a.id * random() * 1000)::INT AS reading,
           now() - (a.id % 60 || 's')::INTERVAL AS reading_date
      FROM generate_series(1, 10000) a (id)
) TO '/tmp/input.csv' WITH CSV;

Whew! That was a lot of work. Now, let’s see what happens when we time the inserts on an empty import table:

real    0m1.162s
user    0m0.168s
sys     0m0.122s

Well, a little over one second isn’t that bad. But suppose we rewrote the python script a bit. Bear with me; I’m going to be silly and use the python script as a simple pass-through. This should simulate a process that applies transformations and outputs another file for direct database import. Here we go:

import psycopg2

file_input = open('/tmp/input.csv', 'r')
processed = open('/tmp/processed.csv', 'w+')

for line in file_input:
    parts = line.strip().split(',')
    processed.write(','.join(parts) + '\n')

file_input.close()
processed.seek(0)

db_conn = psycopg2.connect(database = 'postgres', user = 'postgres')
cur = db_conn.cursor()
cur.copy_from(
    processed, 'sensor_log', ',',
    columns = ('location', 'reading', 'reading_date')
)

processed.close()

db_conn.commit()
db_conn.close()

Now let’s look at the timings involved again:

real    0m0.365s
user    0m0.056s
sys     0m0.004s

That’s about three times faster! Considering how simple this example is, that’s actually pretty drastic. We don’t have many indexes, the table has few columns, and the number of rows is relatively small. The situation gets far worse as all of those things increase.

It’s also not the end of our story. What happens if we disable autocommit, so that each insert gets its own transaction? Some ORMs might do this, or a naive developer might try generating a single script full of insert statements, and not know much about transactions. Let’s see:

real    1m31.794s
user    0m0.233s
sys     0m0.172s

Oh. Ouch. What normally takes around a third of a second can balloon all the way out to a minute and a half. This is one of the reasons I strongly advocate educating developers on proper data import techniques. It’s one thing for a job to be three to five times slower due to inefficient design. It’s quite another to be nearly 250 times slower simply because a programmer believes producing the output file was fast, so logically, inserting it should be similarly speedy. Both scenarios can be avoided by educating anyone involved with data manipulation.

This doesn’t just apply to new hires. Keeping everyone up to date on new techniques is equally important, as are refresher courses. I care about my database, so when possible, I try to over-share as much information as I can manage. I even wrote and presented several talks which I periodically give to our application developers to encourage better database use. Our company Wiki is similarly full of information, which I also present on occasion, if only because reading technical manuals can be quite boring.

If my database is being abused, it’s my job as a DBA to try and alleviate the situation any way I can. Sometimes, that means telling people what they’re doing wrong, and how they can fix it. I certainly didn’t know all of this ten years ago when I was primarily a coder. But I would have appreciated being pointed in the right direction by someone with more experience in the field.

Your database and users deserve it.

01 Aug 14:01

dialog element: shipped in Chrome 37 Beta

by agektmr

Chrome Beta has landed its native support for <dialog> element without needing "Enable experimental Web Platform features." flag turned on.

<dialog>
  <p>This is da dialog!</p>
  <button id="close">Close</button>
</dialog>
<button id="show">Open Dialog!</button>
<script>
  var dialog = document.querySelector('dialog');
  document.querySelector('#show').onclick = function() {
    dialog.show();
  };
  document.querySelector('#close').onclick = function() {
    dialog.close();
  };
</script>

Check out more sample codes and how it works in detail with a live demo.

There are a few changes applied to the implementation since the last announcement but notable one is:

  • Non-modal <dialog> is no longer vertically centered in the viewport. It has no special positioning behavior beyond its default CSS styling.

If you are curious about further details on the spec update, check out diffs here and here.

01 Aug 13:38

PostgreSQL updates 9.3.5, 9.2.9, 9.1.14, 9.0.18, and 8.4.22 released

The PostgreSQL Global Development Group has released an update to all supported version of the database system, including versions 9.3.5, 9.2.9, 9.1.14, 9.0.18, and 8.4.22. This minor release fixes a number of issues discovered and reported by users over the last four months, including some data corruption issues, and is the last update of version 8.4. Users of version 9.3 will want to update at the earliest opportunity; users of version 8.4 will want to schedule an upgrade to a supported PostgreSQL version.

Among the notable issues fixed in this release are:

PostgreSQL 9.3 and pg_upgrade: Users who upgraded to version 9.3 using pg_upgrade may have an issue with transaction information which causes VACUUM to eventually fail. These users should run the script provided in the release notes to determine if their installation is affected, and then take the remedy steps outlined there.

PostgreSQL 9.3 crash recovery: Three issues which could compromise data integrity during crash recovery on master or standby servers in PostgreSQL 9.3 have been fixed.

GIN and GiST indexes: Three issues with GIN and GiST indexes, used for PostGIS and full text indexing, can cause corruption or incorrect query responses. Any indexes on bit or bit varying columns should be rebuilt following the instructions in the release notes.

Security during make check: The insecure socket permissions during "make check", reported in a previous security announcement, have now been fixed.

With this release, version 8.4 is now End-of-Life (EOL), per our Versioning Policy. This means that no additional updates will be released for version 8.4, and users should plan to upgrade to a later version very soon.

In addition the above, this update release includes the following fixes which affect multiple PostgreSQL versions:

  • Fix race condition with concurrent tuple updating
  • Prevent "could not find pathkey item to sort" planner error
  • Properly optimize subqueries with set-returning functions
  • Repair planner regression in optimizing AND/OR NULL
  • Fix planner handling of VARIADIC functions
  • Make json_populate_recordset handle nested JSON properly
  • Prevent corruption of TOAST values when creating complex types
  • Prevent "record type has not been registered" query error
  • Fix a possible crash condition with functions and rewinding cursors
  • Patch three memory leaks
  • Fix row checks for rows deleted by subtransactions
  • Change how pg_stat_activity displays sessions during PREPARE TRANSACTION
  • Prevent multixact ID corruption during VACUUM FULL
  • Fix indentation when displaying complex view definitions
  • Fix client hostname lookup in pg_hba.conf
  • Fix libpython linking on OSX
  • Avoid buffer bloat in libpq
  • Fix an issue with dumping materialized views
  • Fix pg_upgrade's handling of multixact IDs
  • Make sure that pgcrypto clears sensitive information from memory
  • Time zone updates for Crimea, Egypt, and Morocco

Four Windows-specific fixes are included in this release:

  • Prevent tablespace creation recovery errors
  • Fix detection of socket failures
  • Allow users to change parameters after startup
  • Properly quote executable names so they don't fail

A few of the issues above require post-update steps to be carried out by affected users. Please see the release notes for details.

As with other minor releases, users are not required to dump and reload their database or use pg_upgrade in order to apply this update release; you may simply shut down PostgreSQL and update its binaries. Users who have skipped multiple update releases may need to perform additional post-update steps; see the Release Notes for details.

Links:

01 Aug 02:49

Magnus Hagander: The end of PostgreSQL 8.4 - a small tribute

Todays release marks the end of life for PostgreSQL 8.4, after 5 years of service.

I've found it interesting that PostgreSQL 8.4 was probably the first release to actually make it possible to run fairly busy PostgreSQL installations without any hands-on at all. There were many important parts to 8.4 that made that happen, such as much better standby database support (though not hot standby yet - that came in 9.0) and better statistics and monitoring systems. 8.4 also came with Recursive CTEs (WITH-queries) and Window Aggregates, both of which made a whole new set of applications possible.

But I think nothing actually brought about this "run without hands-on" as much as the new code for Visibility Map (VM) and in particular the automatic sizing of the Free Space Map (FSM). Anybody who deployed 8.3 or earlier in any kind of busy environment knows the pain of trying to configure max_fsm_pages correctly. It was almost impossible to get it right, and the value of right kept changing with your load and data. And the worst part of it all was that if you got it wrong you were in trouble - there wasn't really any remedy other than taking your database offline (or at least read-only) for manual full database vacuums (there were tricks to get around the vacuum specifics, but the core problem was there). So what happened was that a lot of those people who knew what to do just increased that number to something that was "big enough", which usually meant "way too big" and thus wasting resources. And even with that, sometimes ran into it not being big enough because the workload changed.

In fact, I think more or less every single system I did reviews for customers for on those versions had a substantially wrong number in max_fsm_pages - usually the default value because they had no idea what to do with it - and were paying the price for it.

Extra funny is that I've been talking to Heikki (who wrote the dynamic FSM and VM code) a few times recently, and he's still surprised that these changes had such a big impact on real life deployments. Probably because it's one of those things that is usually not a big problem at all in small installations, developer installations, and testing systems, but can quickly snowball in real life production. I think many of us didn't realize before the release actually made it out there how useful it would be.

This feature, together with things like Recursive CTEs and Window Functions really makes 8.4 one of the landmark PostgreSQL releases. It's easier to point to releases like 9.0 which had Streaming Replication and Hot Standby because they are sexier and more marketable features, but infrastructure like this is more important than we often think.

8.4 got rid of some of the hardest things to tune. Let's stay on the path of trying to keep the system simple enough to use that it doesn't need handholding, and look forward to the upcoming 9.4 release!