sexta-feira, 18 de fevereiro de 2011

mSysGit - Cliente Git nativo para Windows

Seguindo minha série de posts sobre Git, vou falar hoje da parte cliente, especificamente para Windows. Quando comecei a trabalhar com o Git no Windows a única opção que tinha disponível era via Cygwin, um emulador de Linux para Windows; porém tinhamos problema com pastas e arquivos acentuados. Depois de algum tempo tive uma grata surpresa ao conhecer um projeto que visava ser um cliente git nativo para Windows: o mSysGit. Atualmente, na data que escrevo este artigo, está na versão 1.7.4. Porém este cliente não é visual; é um cliente de linha de comando. Existem clientes visuais, dos quais falarei em outros posts, porém todos rodam sobre o mSysGit.

Instalação

Após fazer o download do instalador, vamos à instalação então:

Tela inicial

Contrato

Caminho para instalação

Na tela abaixo temos algumas opções interessantes como a parte de integração com o menu de contexto do Windows Explorer (o git-cheetah possui opções a mais que Git Bash e Git GUI) e associação de arquivos que começam com o padrão .git* com o editor de texto padrão.
Componentes

Pasta no Menu Iniciar

Na tela abaixo será definindo como o git funcionará via linha de comando: se somente dentro do Git Bash ou se o git será adicionado ao PATH do SO podendo ser usado pelo prompt de comando ou se, além do git, as demais ferramentas Unix que acompanham o mSysGit (comandos Unix diversos como ls, cp, mv, ssh-keygen) também serão adicionadas ao PATH. Nesta última opção ele avisa que alguns comandos do Windows poderão ser sobrepostos. O padrão é usar somente Git Bash.
Configuração do PATH

Na tela abaixo é definido como o Git irá tratar as quebras de linha nos arquivos (devido ao fato que o Git é muito usado em projetos que também são desenvolvidos em ambiente Linux/Unix e os dois SO's tratam de maneira diferem a quebra de linha): com a primeira opção ele ira usar quebra de linha padrão Windows quando fizer checkout dos arquivos e vai usar quebra de linha padrão Unix quando der commit (é a opção mais aconselhável); na segunda opção, a quebra de linha não será alterada no momento do checkout, porém vai usar quebra de linha padrão Unit no momento do commit; na terceira opção a quebra de linha não será alterada em nenhum momento.
Estilo de quebra de linha

Instalando

Finalizando

Utilização

Após a instalação, você poderá ver os ícones do Git disponíveis no menu iniciar.

Ícones do Git no menu iniciar do Windows.

Ele também se integra com o menu de contexto do Windows Explorer.

Git integrado com o menu de contexto do Windows Explorer

A partir daí, você pode usar as ferramentas que o mSysGit disponibiliza:

Git Bash

Gui GUI

GitK

Em breve escreverei sobre alguns clientes Git com interface gráfica mais elaborada, porém que não dispensam a necessitam do mSysGit.

terça-feira, 25 de maio de 2010

Instalando e Configurando o Gitosis no Ubuntu

Este é primeiro artigo de uma série que irei escrever falando sobre o Git que, na minha opinião, é uma das melhores ferramentas de SCM disponíveis no mercado. Posteriormente falarei um pouco sobre o histórico do Git, porém no momento vou me concentrar em como configurar um servidor para servir de repositório central para todos os seus repositórios Git. Apesar de ser um DCVS, ter um repositório centralizado oferece diversas facilidades como, por exemplo, um referência de onde todos os desenvolvedores podem atualizar seus repositórios locais.
Existem bons serviços disponíveis na web para armazenar repositórios Git como, por exemplo, o GitHub e o Assembla, sendo que este último é um portal de gerenciamento de projetos que oferece também o serviço de armazenamento de repositórios. Porém, devido aos mais variados motivos, pode ser conveniente ou necessário que os nossos repositórios sejam armazenados num servidor próprio, seja local ou nas nuvens. Assim sendo, vou mostrar neste tutorial como instalar e configurar o Gitosis, que é uma ferramenta para armazenar repositórios Git, numa máquina rodando Ubuntu.

Instalando o Gitosis

Antes de iniciar, é sempre bom atualizarmos nossos repositórios do Ubuntu:

sudo apt-get update

Feito isso, vamos criar um diretório onde vamos clonar o Gitosis:

cd ~
mkdir src
cd src

Tudo pronto pra clonagem (lembrei de alguns filmes de ficção científica e da novela "O Clone" :D ):

git clone git://eagain.net/gitosis.git

Se aparecer uma mensagem de erro, falando que o git não está instalado, você pode instala-lo da seguinte maneira:

sudo apt-get install git-core

Após finalizar o clone, vai ser criado dentro de ~/src um diretório gitosis. Para prosseguir com a instalação:

cd gitosis
sudo python setup.py install

Normalmente você não terá problemas com o Python, pois o mesmo já vem instalado por padrão, mas pode ocorrer um erro relacionado ao setuptools, que é uma biblioteca python usada em scripts de instalação. Para resolver este problema:

sudo apt-get install python-setuptools

Feito isso, o Gitosis estará instalado. Passamos, então, à fase de configuração.

Configurando o Gitosis

A primeira coisa a fazermos é criar o usuário sob o qual rodará o Gitosis:

sudo adduser \
--system \
--shell /bin/sh \
--gecos 'git version control' \
--group \
--disabled-password \
--home /home/git \
git

No comando acima estamos criando um usuario chamado git, que não precisa ter senha (--disable-password), porém precisa de um shell válido (--shell /bin/sh). O diretório home (--home /home/git) foi definindo seguindo o padrão linux, porém poderia ser configurado para qualquer outra pasta; neste diretório serão armazenados os repositórios Git.

Agora precisamos gerar uma chave RSA de acesso, visto que o Git roda sobre SSH:

ssh-keygen -t rsa
Vamos, então, iniciar o nosso repositório de configuração do Gitosis:

sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub

Isso já vai incluir a chave do nosso servidor na lista de permissões do Gitosis. Se tudo der certo, aparecerá duas vezes uma mensagem falando que o repositório foi inicializado.

Por segurança, devemos garantir que o hook de post-update do repostório de configuração está com permissão de execução:

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

Agora vamos clonar o repositório de configuração do Gitosis:

cd ~
git clone git@localhost:gitosis-admin.git

Se ocorrer um erro de connection refused na porta 22, é preciso instalar o OpenSSH-Server (lembra-se que o Git roda sobre SSH??):

sudo apt-get install openssh-server

Quando ele perguntar se você deseja adicionar a chave do servidor na lista de hosts conhecidos, responda yes.

OK, agora dentro de ~ temos o diretório gitosis-admin e dentro dele temos os seguintes itens:
  • Arquivo gitosis.conf => Onde configuramos os repositórios disponíveis e o acesso dos usuários a eles;
  • Diretório keydir => Onde devem ser armazenadas as chaves RSA dos usuários que poderão acessar os repositórios do servidor.
Como o diretório gitosis-admin é um repositório Git, todas as alteração feitas nele deverão ser comitadas (git commit) e enviadas para o repositório central (git push).

Criando novos repositórios

Para começar, abra o arquivo gitosis.conf. Ele deve parecer da seguinte forma:

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = usuario@nome_ubuntu

Onde temos o nome do grupo entre [], o nome dos projetos com permissão de escrita (writeable) e o usuário que possui esta permissão. Para adicionar um novo projeto, podemos adicionar as seguintes linhas:

[group equipe]
writable = projeto1 projeto2 projeto3
readonly = projeto4
members = usuario1@maquina1 usuario2@maquina2

No exemplo acima, estamos dando permissão de escrita para os projetos 1, 2 e 3 e acesso somente leitura (readonly) ao projeto4 para os usuários usuario1@maquina1 e usuario2@maquina2. Esses nomes de usuario vem do arquivo id_rsa.pub que é gerado em cada máquina:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAniABr9ynN57KK0ScYDM0lM3h9KBRpa7b
FBIM1aoX2slOKbj4gSdFk2P29tmFb505lly+xsXXCJ//iHheLgpRUcIPG+fLUXYiOhT6
+dv3ERlrhHQ0XmByayMafWyKvsQw6HYjfPNbt4RUnKSLuERSuQsiORCrT0j34lg2ASMk
0+QLOl6HRI1+4GQHXnLydMVbV1dvHeCf1hHfRMcjk5dAmb8m+EW7JJuNjnCby4psEFpG
70ff1T8l8JL1bUwcECfoEQ7GtpjeOTdGCW14D0cb36uXRWvU03kBLJFBbGn7Wuu4VPFz
t2ACPfim8fe9LWGguVVcEKjFonxXJs9BJsMecQ== usuario1@maquina1

Após serem gerados nas máquinas, os arquivos id_rsa.pub devem ser copiados para a pasta ~/gitosis-admin/keydir e renomeados de acordo com o nome do usuário. Seguindo o exemplo acima, teriamos 2 arquivos dentro do diretório keydir chamados usuario1@maquina1.pub e usuario2@maquina2.pub .

Após feitas estas configurações, como já foi dito anteriormente, devemos comitar as alterações e enviar para o repositório central:

cd ~/gitosis-admin
git add keydir
git add gitosis.conf
git commit -m "Adicionados novos projetos e usuarios"
git push

Feito isso, as configurações já estão valendo no servidor e os usuários que tiverem acesso já podem clonar os repositórios normalmente.

terça-feira, 28 de abril de 2009

Configurando o Amazon EC2 e S3

Para quem não conhece o EC2 (Elastic Compute Cloud), é um serviço oferecido pela Amazon para soluções de cloud computing, assim como o S3 (Simple Storage Service) é oferecido para armazenamento de dados na nuvem. Ambos são taxados pela Amazon pela quantidade usada: no caso do EC2, no modo on-demand, é cobrado por hora de uso e no caso do S3, é cobrado por GB armazenado. Ou seja, são oferecidos como serviço, utilizando o conceito de SaaS (Software as Service) , onde pagamos pelo serviço que consumimos.

Características

EC2
O EC2 possui a característica de permitir a virtualização de diversos tipos de SO's, como Windows, Linux e Solaris, similar ao que faz o VMWare, Virtual PC, etc., com a grande diferença que isso estará rodando remotamente.
Existem duas modalidades disponíveis para contratação: on-demand e reserved, cada qual com diversas configurações disponíveis. Na modalidade on-demand, você paga pela hora de processamento que você usa, ou seja, pelo tempo que a instância vai ficar rodando. Já na modalidade reserved, você tem uma fidelização de 1 ou 3 anos, pagando de uma só vez por todo o período contratado, porém ganhando um expressivo desconto no valor cobrado por hora.
Um detalhe muito importante sobre o EC2, e que às vezes causa muitas dúvidas, é que as instâncias só existem enquanto estão rodando. Se um instância for desligada, ele simplesmente deixa de existir, não sendo possível inicia-la novamente. Ou seja, se você criou uma instância linux, instalou todos os programas que você precisa, salvou arquivos, etc e tal, e desligou a instância, você perde todo o seu trabalho. Você pode até dizer "Ah, mas isso é o fim do mundo...", "Como uma empresa do porte da Amazon faz uma coisa dessas?", etc. Calma, calma, não priemos cânico (quem lembrou do Chapolin Colorado??). Como iremos posteriormente, existem soluções para não "perder" todo o seu trabalho.

S3
Esse é o melhor amigo do EC2, tanto que você não consegue contratar o EC2 sem contratar o S3. Ele serve para armazenar os dados que precisam ser persistentes e também as AMI's (Amazon Machine Images) que você criar. Se você não sabe o que é uma AMI, não se desespere, pois também vamos falar disso logo abaixo.

Como começar

Bem, a primeira coisa a fazer para começar usar o serviço é, logicamente, contratar o serviço. Isso pode ser feito acessando http://aws.amazon.com/ec2/ e clicando na opção 'Sign Up for Amazon EC2'.

Na tela seguinte, faça o login usando uma conta já existente um crie uma nova conta. Depois disso serão mostrados os preços do serviço, solicitados os dados do cartão, a modalidade e configuração desejada.
Quando for solicitado o certificado X.509, peça pra criar um novo e salve os arquivos de chave pública e privada em um local que você se lembre posteriormente, pois eles serão necessários para acessar o serviço. No caso de perda, não há como recuperar o certificado, sendo necessário criar um novo certificado.
Depois no portal da sua conta ("Your Account"), no item "Access Identifiers", se tem acesso a informações muitos importantes, como o Account Number, o Access Key ID e a Secret Access Key, além do certificado X.509 já criado anteriormente.


Criando a primeira instância

Para iniciar instâncias e, posteriormente, gerencia-las, existe a opção do AWS Management Console, que é a 3ª opção abaixo de Access Identifiers. As instâncias são criadas com base em AMI's (Amazon Machine Images), que são modelos de instalações, ou seja, após criar uma instância com base em uma determinada AMI, esta instância já virá com todas as configurações que foram definidas na imagem, ou seja, não será necessário realizar o processo de instalação do SO. Ao acessar o console, clique na aba "Amazon EC2" e logo após em "Launch Instance".

Na tela que abre ("Choose an AMI"), existem 3 opções:
  • Quick Start: mostra as AMIs disponibilizadas pela próprima Amazon. Atualmente são diponibilizadas nessa opção algumas configurações de Fedora e Windows.
  • My AMIs: mostra as AMIs criadas pelo usuário.
  • Community AMIs: mostra as AMI criadas por outros usuários EC2 e que as tornaram públicas. Nessa opções existem diversas configurações de CentOS, Debian, Fedora, Gentoo, Open Solaris, Red Hat, SUSE, Ubuntu e Windows.
Neste tutorial vamos escolher, em QuickStart, a primeira opção, Getting Stared on Fedora Core 8, e clicar em Select.


Na próxima tela ("Create Key Pair"), poderá ser criada a chave que permitirá a conexão via ssh. Informe um nome para a chave e clique na opção Create & Download Your Key Pair para efetuar o download do arquivo gerado. É aconselhável salvar esse arquivo juntamente com os arquivos do certificado X.509 já gerados anteriormente. Após o término do download, clique na opção Continue.

Na próxima tela ("Configure Firewall"), poderá ser criado um grupo de segurança, através do qual poderemos definir restrições de portas no Firewall. Informe o nome do grupo, a descrição e selecione as portas que estarão liberadas para este grupo. Neste momente, só são disponibilizadas para liberação as portas 80(HTTP) e 22(SSH). Posteriormente poderão ser liberadas outras portas. Ao término, clique no botão Continue.

Na última tela ("Launch"), poderá ser definido a quantidade de instâncias que se deseja rodar com as configurações previamente definidas e o tipo de instância desejado, cujas opções variam de acordo com a modalidade contratada. Além disso, você poderá rever as configurações das telas anterior. Ao término, clique no botão Launch.

Após isso, a instância será iniciada e, em alguns segundos, está disponível para seu uso. Isso pode ser verificado na opção Instances do AWS Console, que vai listar todas as instâncias que estão rodando. Quando o status da instância mudar para running, a mesma estará pronta para uso.

Neste link você pode ver como usar o putty para se conectar à sua instância no EC2.

Nos próximos posts, falaremos, dentre outros assuntos, sobre o plugin Elasticfox e sobre criar sua própria AMI.

quarta-feira, 10 de outubro de 2007

Lista de funções pascal script do InnoSetup

Exception functions
procedure Abort;
procedure RaiseException(const Msg: String);
function GetExceptionMessage: String;
procedure ShowExceptionMessage;

System functions
function IsAdminLoggedOn: Boolean;
function IsPowerUserLoggedOn: Boolean;
function UsingWinNT: Boolean;
function GetWindowsVersion: Cardinal;
procedure GetWindowsVersionEx(var Version: TWindowsVersion);
function GetWindowsVersionString: String;
function IsWin64: Boolean;
function Is64BitInstallMode: Boolean;
function ProcessorArchitecture: TSetupProcessorArchitecture;
function InstallOnThisVersion(const MinVersion, OnlyBelowVersion: String): Integer;
function GetEnv(const EnvVar: String): String;
function GetUserNameString: String;
function GetComputerNameString: String;
function GetUILanguage: Integer;
function FindWindowByClassName(const ClassName: String): HWND;
function FindWindowByWindowName(const WindowName: String): HWND;
function SendMessage(const Wnd: HWND; const Msg, WParam, LParam: Longint): Longint;
function PostMessage(const Wnd: HWND; const Msg, WParam, LParam: Longint): Boolean;
function SendNotifyMessage(const Wnd: HWND; const Msg, WParam, LParam: Longint): Boolean;
function RegisterWindowMessage(const Name: String): Longint;
function SendBroadcastMessage(const Msg, WParam, LParam: Longint): Longint;
function PostBroadcastMessage(const Msg, WParam, LParam: Longint): Boolean;
function SendBroadcastNotifyMessage(const Msg, WParam, LParam: Longint): Boolean;
procedure CreateMutex(const Name: String);
function CheckForMutexes(Mutexes: String): Boolean;
procedure MakePendingFileRenameOperationsChecksum: String;
procedure UnloadDLL(Filename: String);
function DLLGetLastError(): Longint;

String functions
function Chr(B: Byte): Char;
function Ord(C: Char): Byte;
function Copy(S: String; Indx, Count: Integer): String;
function Length(s: String): Longint;
function Lowercase(S: String): String;
function Uppercase(S: String): String;
function AnsiLowercase(S: String): String;
function AnsiUppercase(S: String): String;
function StringOfChar(c: Char; I : Longint): String;
procedure Delete(var S: String; Indx, Count: Integer);
procedure Insert(Source: String; var Dest: String; Indx: Integer);
procedure StringChange(var S: String; const FromStr, ToStr: String);
function Pos(SubStr, S: String): Integer;
function AddQuotes(const S: String): String;
function RemoveQuotes(const S: String): String;
function ConvertPercentStr(var S: String): Boolean;
function CompareText(const S1, S2: string): Integer;
function CompareStr(const S1, S2: string): Integer;
function Format(const Format: string; const Args: array of const): string;
function Trim(const S: string): String;
function TrimLeft(const S: string): String;
function TrimRight(const S: string): String;
function StrToIntDef(s: string; def: Longint): Longint;
function StrToInt(s: string): Longint;
function IntToStr(i: Longint): String;
function CharLength(const S: String; const Index: Integer): Integer;
function AddBackslash(const S: String): String;
function RemoveBackslashUnlessRoot(const S: String): String;
function RemoveBackslash(const S: String): String;
function AddPeriod(const S: String): String;
function ExtractFileExt(const FileName: string): String;
function ExtractFileDir(const FileName: string): String;
function ExtractFilePath(const FileName: string): String;
function ExtractFileName(const FileName: string): String;
function ExtractFileDrive(const FileName: string): String;
function ExtractRelativePath(const BaseName, DestName: String): String;
function ExpandFileName(const FileName: string): String;
function ExpandUNCFileName(const FileName: string): String;
function GetDateTimeString(const DateTimeFormat: String; const DateSeparator, TimeSeparator: Char): String;
procedure SetLength(var S: String; L: Longint);
procedure CharToOemBuff(var S: String);
procedure OemToCharBuff(var S: String);
function GetMD5OfString(const S: String): String;
function SysErrorMessage(ErrorCode: Integer): String;

Array functions
function GetArrayLength(var Arr: Array): Longint;
procedure SetArrayLength(var Arr: Array; I: Longint);

File System functions
function DirExists(const Name: String): Boolean;
function FileExists(const Name: String): Boolean;
function FileOrDirExists(const Name: String): Boolean;
function FileSize(const Name: String; var Size: Integer): Boolean;
function GetSpaceOnDisk(const Path: String; const InMegabytes: Boolean; var Free, Total: Cardinal): Boolean;
function FileSearch(const Name, DirList: string): String;
function FindFirst(const FileName: String; var FindRec: TFindRec): Boolean;
function FindNext(var FindRec: TFindRec): Boolean;
procedure FindClose(var FindRec: TFindRec);
function GetCurrentDir: String;
function SetCurrentDir(const Dir: string): Boolean;
function GetWinDir: String;
function GetSystemDir: String;
function GetSysWow64Dir: String;
function GetTempDir: String;
function GetShellFolder(Common: Boolean; const ID: TShellFolderID): String;
function GetShellFolderByCSIDL(const Folder: Integer; const Create: Boolean): String;
function GetShortName(const LongName: String): String;
function GenerateUniqueName(Path: String; const Extension: String): String;
function GetVersionNumbers(const Filename: String; var VersionMS, VersionLS: Cardinal): Boolean;
function GetVersionNumbersString(const Filename: String; var Version: String): Boolean;
function IsProtectedSystemFile(const Filename: String): Boolean;
function GetMD5OfFile(const Filename: String): String;

File functions
function Exec(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
function ShellExec(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean;
function RenameFile(const OldName, NewName: string): Boolean;
function ChangeFileExt(const FileName, Extension: string): String;
function FileCopy(const ExistingFile, NewFile: String; const FailIfExists: Boolean): Boolean;
function DeleteFile(const FileName: string): Boolean;
procedure DelayDeleteFile(const Filename: String; const Tries: Integer);
function LoadStringFromFile(const FileName: String; var S: String): Boolean;
function LoadStringsFromFile(const FileName: String; var S: TArrayOfString): Boolean;
function SaveStringToFile(const FileName, S: String; const Append: Boolean): Boolean;
function SaveStringsToFile(const FileName: String; const S: TArrayOfString; const Append: Boolean): Boolean;
function CreateDir(const Dir: string): Boolean;
function ForceDirectories(Dir: string): Boolean;
function RemoveDir(const Dir: string): Boolean;
function DelTree(const Path: String; const IsDir, DeleteFiles, DeleteSubdirsAlso: Boolean): Boolean;
function CreateShellLink(const Filename, Description, ShortcutTo, Parameters, WorkingDir, IconFilename: String; const IconIndex, ShowCmd: Integer): String;
procedure RegisterServer(const Is64Bit: Boolean; const Filename: String; const FailCriticalErrors: Boolean);
function UnregisterServer(const Is64Bit: Boolean; const Filename: String; const FailCriticalErrors: Boolean): Boolean;
procedure RegisterTypeLibrary(const Is64Bit: Boolean; const Filename: String);
function UnregisterTypeLibrary(const Is64Bit: Boolean; const Filename: String): Boolean
procedure IncrementSharedCount(const Is64Bit: Boolean; const Filename: String; const AlreadyExisted: Boolean);
function DecrementSharedCount(const Is64Bit: Boolean; const Filename: String): Boolean;
procedure RestartReplace(const TempFile, DestFile: String);
procedure UnregisterFont(const FontName, FontFilename: String);
function ModifyPifFile(const Filename: String; const CloseOnExit: Boolean): Boolean;

Registry functions
function RegKeyExists(const RootKey: Integer; const SubKeyName: String): Boolean;
function RegValueExists(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;
function RegGetSubkeyNames(const RootKey: Integer; const SubKeyName: String; var Names: TArrayOfString): Boolean;
function RegGetValueNames(const RootKey: Integer; const SubKeyName: String; var Names: TArrayOfString): Boolean;
function RegQueryStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegQueryMultiStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegQueryDWordValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultDWord: Cardinal): Boolean;
function RegQueryBinaryValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegWriteStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteExpandStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteMultiStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteDWordValue(const RootKey: Integer; const SubKeyName, ValueName: String; const Data: Cardinal): Boolean;
function RegWriteBinaryValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegDeleteKeyIncludingSubkeys(const RootKey: Integer; const SubkeyName: String): Boolean;
function RegDeleteKeyIfEmpty(const RootKey: Integer; const SubkeyName: String): Boolean;
function RegDeleteValue(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;

INI File functions
function IniKeyExists(const Section, Key, Filename: String): Boolean;
function IsIniSectionEmpty(const Section, Filename: String): Boolean;
function GetIniBool(const Section, Key: String; const Default: Boolean; const Filename: String): Boolean
function GetIniInt(const Section, Key: String; const Default, Min, Max: Longint; const Filename: String): Longint;
function GetIniString(const Section, Key, Default, Filename: String): String;
function SetIniBool(const Section, Key: String; const Value: Boolean; const Filename: String): Boolean;
function SetIniInt(const Section, Key: String; const Value: Longint; const Filename: String): Boolean;
function SetIniString(const Section, Key, Value, Filename: String): Boolean;
procedure DeleteIniSection(const Section, Filename: String);
procedure DeleteIniEntry(const Section, Key, Filename: String);
Custom Setup Wizard Page functions
function CreateInputQueryPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String): TInputQueryWizardPage;
function CreateInputOptionPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String; Exclusive, ListBox: Boolean): TInputOptionWizardPage;
function CreateInputDirPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String; AAppendDir: Boolean; ANewFolderName: String): TInputDirWizardPage;
function CreateInputFilePage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String): TInputFileWizardPage;
function CreateOutputMsgPage(const AfterID: Integer; const ACaption, ADescription, AMsg: String): TOutputMsgWizardPage;
function CreateOutputMsgMemoPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption, AMsg: String): TOutputMsgMemoWizardPage;
function CreateOutputProgressPage(const ACaption, ADescription: String): TOutputProgressWizardPage;
function CreateCustomPage(const AfterID: Integer; const ACaption, ADescription: String): TWizardPage;
function CreateCustomForm: TSetupForm;
function PageFromID(const ID: Integer): TWizardPage;
function ScaleX(X: Integer): Integer;
function ScaleY(Y: Integer): Integer;

Dialog functions
function MsgBox(const Text: String; const Typ: TMsgBoxType; const Buttons: Integer): Integer;
function SuppressibleMsgBox(const Text: String; const Typ: TMsgBoxType; const Buttons, Default: Integer): Integer;
function GetOpenFileName(const Prompt: String; var FileName: String; const InitialDirectory, Filter, DefaultExtension: String): Boolean;
function BrowseForFolder(const Prompt: String; var Directory: String; const NewFolderButton: Boolean): Boolean;
function ExitSetupMsgBox: Boolean;
COM Automation objects support functions
function CreateOleObject(const ClassName: string): Variant;
function GetActiveOleObject(const ClassName: string): Variant;
procedure CoFreeUnusedLibraries;
Setup Logging functions
procedure Log(const S: String);

Other functions
procedure Sleep(const Milliseconds: LongInt);
function Random(const Range: Integer): Integer;
procedure Beep;
procedure BringToFrontAndRestore;
Deprecated functions
function LoadDLL(const DLLName: String; var ErrorCode: Integer): Longint;
function CallDLLProc(const DLLHandle: Longint; const ProcName: String; const Param1, Param2: Longint; var Result: Longint): Boolean;
function FreeDLL(const DLLHandle: Longint): Boolean;
function CastStringToInteger(var S: String): Longint;
function CastIntegerToString(const L: Longint): String;