Indico um link para diversos livros (em inglês) de programação disponíveis para download grátis. São livros sobre diversas linguagens de programação: Python, Ruby, C, C#, C++, CGI, JavaScript, Perl, Delphi, Pascal, Haskell, Java, Lisp, PHP e Prolog além de programação de jogos e engenharia de software.
Os livros estão em formatos para leitura online e para download.
Lançada no dia 27 de junho, a versão 3.1 do Python. Traz as seguintes melhorias:
- Novo tipo para dicionário ordenado
- Várias otimizações no tipo int
- Novas funcionalidades do unittest
- Um modulo io muito mais rápido
- Nova sintaxe para declarações with aninhadas
Informações adicionais podem ser obtidas nos links:
Existem várias estratégias possíveis de backup do servidor do Trac e do Subversion, mas executar o backup diretamente sobre os repositórios não é a melhor alternativa. Para os repositórios do Subversion usando o formato FSFS, um backup direto até funciona, mas para o Trac, que usa um banco de dados internamente, o backup pode acabar pegando o banco de dados em um estado intermediário e depois haverá problemas para restaurá-lo.
A estratégia usada no script mostrado neste artigo é criar uma cópia dos repositórios em um lugar específico e aí sim, esse lugar específico deverá usado para fazer o backup total dos repositórios.
Tanto o Trac quanto o Subversion possuem comandos administrativos para criar uma hotcopy, isto é, uma cópia do repositório enquanto o original ainda está em uso. Este comando executa automaticamente todo o procedimento para eliminar quaisquer inconsistências que poderiam ser produzidas durante a cópia de um repositório em uso.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import shutil
def limpa_diretorio_backup(diretorio):
if os.path.exists(diretorio):
print 'rm -rf %s' % diretorio
shutil.rmtree(diretorio)
print 'mkdir %s' % diretorio
os.mkdir(diretorio)
def hotcopy(diretorio_origem, diretorio_destino, comando_hotcopy):
limpa_diretorio_backup(diretorio_destino)
for nome_repos in os.listdir(diretorio_origem):
caminho_repos = os.path.join(diretorio_origem, nome_repos)
if not os.path.isdir(caminho_repos):
continue
destino_repos = os.path.join(diretorio_destino, nome_repos)
print comando_hotcopy % (caminho_repos, destino_repos)
os.system(comando_hotcopy % (caminho_repos, destino_repos))
diretorio_repos_svn = '/srv/svn'
diretorio_backup_svn = '/srv/backup/svn'
svnadmin_hotcopy = 'svnadmin hotcopy %s %s'
diretorio_env_trac = '/srv/trac'
diretorio_backup_trac = '/srv/backup/trac'
trac_admin_hotcopy = 'trac-admin %s hotcopy %s'
hotcopy(diretorio_repos_svn, diretorio_backup_svn, svnadmin_hotcopy)
hotcopy(diretorio_env_trac, diretorio_backup_trac, trac_admin_hotcopy)
|